FrontISTR  5.9.0
Large-scale structural analysis program with finit element method
element.f90
Go to the documentation of this file.
1 !-------------------------------------------------------------------------------
2 ! Copyright (c) 2019 FrontISTR Commons
3 ! This software is released under the MIT License, see LICENSE.txt
4 !-------------------------------------------------------------------------------
31 ! If you wish introduce new elements with new geometry or/and
32 ! new shape functions, you need do the following
33 !!
34 !!
35 !!- Introduce new element ID corresponding to your element in this module.
36 !!- Provide corresponding shape function and shape derivative in a new
37 !! module and include this new module here.
38 !!- Add the information of your new element into functions listed above.
39 !!- If new quadrature method needed, do some modification in MODULE
40 !! Quadrature.
41 !!- If you introduce new surface geometry and do contact calculation also,
42 !! you may need do some modification in MODULE mSurfElement.
44 
45  use shape_line2n
46  use shape_line3n
47  use shape_tri3n
48  use shape_tri6n
49  use shape_quad4n
50  use shape_quad8n
51  use shape_quad9n
52  use shape_hex8n
53  use shape_hex20n
54  use shape_tet4n
55  use shape_tet10n
56  use shape_prism6n
57  use shape_prism15n
58  use m_utilities, only: cross_product
59  implicit none
60 
61  integer, parameter, private :: kreal = kind(0.0d0)
62 
63  !-------------------------------------------
64  ! Fllowing ID of element types
65  !-------------------------------------------
66  integer, parameter :: fe_unknown = -1
67 
68  integer, parameter :: fe_line2n = 111
69  integer, parameter :: fe_line3n = 112
70  integer, parameter :: fe_tri3n = 231
71  integer, parameter :: fe_tri6n = 232
72  integer, parameter :: fe_tri6nc = 2322
73  integer, parameter :: fe_quad4n = 241
74  integer, parameter :: fe_quad8n = 242
75  integer, parameter :: fe_truss = 301
76  integer, parameter :: fe_tet4n = 341
77  integer, parameter :: fe_tet4n_pipi = 3414
78  integer, parameter :: fe_tet10n = 342
79  integer, parameter :: fe_tet10nc = 3422
80  integer, parameter :: fe_prism6n = 351
81  integer, parameter :: fe_prism15n = 352
82  integer, parameter :: fe_hex8n = 361
83  integer, parameter :: fe_hex20n = 362
84  integer, parameter :: fe_hex27n = 363
85 
86  integer, parameter :: fe_if_line2n = 511
87 
88  integer, parameter :: fe_beam2n = 611
89  integer, parameter :: fe_beam3n = 612
90  integer, parameter :: fe_beam341 = 641
91 
92  integer, parameter :: fe_tri6n_shell = 732
93  integer, parameter :: fe_dsg3_shell = 733
94  integer, parameter :: fe_mitc3_shell = 731
95  integer, parameter :: fe_mitc4_shell = 741
96  integer, parameter :: fe_mitc8_shell = 742
97  integer, parameter :: fe_mitc9_shell = 743
98 
99  integer, parameter :: fe_mitc3_shell361 = 761
100  integer, parameter :: fe_mitc4_shell361 = 781
101 
102  integer, parameter :: fe_nodesmooth_tet4n = 881
103  integer, parameter :: fe_edgesmooth_tet4n = 891
104 
105  integer, parameter :: fe_tri3n_patch = 1031
106  integer, parameter :: fe_tri6n_patch = 1032
107  integer, parameter :: fe_quad4n_patch = 1041
108  integer, parameter :: fe_quad8n_patch = 1042
109  ! ---------------------------------------------
110 
111 contains
112 
113  !************************************
114  ! Following geometric information
115  !************************************
117  integer(kind=kind(2)) function getspacedimension( etype )
118  integer, intent(in) :: etype
119 
120  select case( etype)
125  case default
127  end select
128  end function
129 
131  integer(kind=kind(2)) function getnumberofnodes( etype )
132  integer, intent(in) :: etype
133 
134  select case (etype)
136  getnumberofnodes = 2
137  case (fe_line3n, fe_beam3n)
138  getnumberofnodes = 3
140  getnumberofnodes = 3
142  getnumberofnodes = 6
144  getnumberofnodes = 4
146  getnumberofnodes = 8
147  case ( fe_mitc9_shell )
148  getnumberofnodes = 9
150  getnumberofnodes = 4
151  case ( fe_tet10n, fe_tet10nc )
152  getnumberofnodes = 10
153  case ( fe_prism6n )
154  getnumberofnodes = 6
155  case ( fe_prism15n )
156  getnumberofnodes = 15
157  case ( fe_hex8n )
158  getnumberofnodes = 8
159  case ( fe_hex20n )
160  getnumberofnodes = 20
161  case default
162  getnumberofnodes = -1
163  ! error message
164  end select
165  end function
166 
168  integer(kind=kind(2)) function getnumberofsubface( etype )
169  integer, intent(in) :: etype
170 
171  select case (etype)
180  case ( fe_prism6n, fe_prism15n )
182  case ( fe_hex8n, fe_hex20n)
186  case default
187  getnumberofsubface = -1
188  ! error message
189  end select
190  end function
191 
193  subroutine getsubface( intype, innumber, outtype, nodes )
194  integer, intent(in) :: intype
195  integer, intent(in) :: innumber
196  integer, intent(out) :: outtype
197  integer, intent(out) :: nodes(:)
198 
199  if( innumber>getnumberofsubface( intype ) ) stop "Error in getting subface"
200  select case ( intype )
202  outtype = fe_tri3n
203  select case ( innumber )
204  case (1)
205  nodes(1)=1; nodes(2)=2; nodes(3)=3
206  case (2)
207  nodes(1)=4; nodes(2)=2; nodes(3)=1
208  case (3)
209  nodes(1)=4; nodes(2)=3; nodes(3)=2
210  case (4)
211  nodes(1)=4; nodes(2)=1; nodes(3)=3
212  end select
213  case (fe_tet10n)
214  outtype = fe_tri6n
215  select case ( innumber )
216  case (1)
217  nodes(1)=1; nodes(2)=2; nodes(3)=3
218  nodes(4)=5; nodes(5)=6; nodes(6)=7
219  case (2)
220  nodes(1)=4; nodes(2)=2; nodes(3)=1
221  nodes(4)=9; nodes(5)=5; nodes(6)=8
222  case (3)
223  nodes(1)=4; nodes(2)=3; nodes(3)=2
224  nodes(4)=10; nodes(5)=6; nodes(6)=9
225  case (4)
226  nodes(1)=4; nodes(2)=1; nodes(3)=3
227  nodes(4)=8; nodes(5)=7; nodes(6)=10
228  end select
229  case (fe_tet10nc)
230  outtype = fe_tri6nc
231  select case ( innumber )
232  case (1)
233  nodes(1)=1; nodes(2)=2; nodes(3)=3
234  nodes(4)=5; nodes(5)=6; nodes(6)=7
235  case (2)
236  nodes(1)=4; nodes(2)=2; nodes(3)=1
237  nodes(4)=9; nodes(5)=5; nodes(6)=8
238  case (3)
239  nodes(1)=4; nodes(2)=3; nodes(3)=2
240  nodes(4)=10; nodes(5)=6; nodes(6)=9
241  case (4)
242  nodes(1)=4; nodes(2)=1; nodes(3)=3
243  nodes(4)=8; nodes(5)=7; nodes(6)=10
244  end select
245  case ( fe_hex8n )
246  outtype = fe_quad4n
247  select case ( innumber )
248  case (1)
249  nodes(1)=1; nodes(2)=2; nodes(3)=3; nodes(4)=4
250  case (2)
251  nodes(1)=8; nodes(2)=7; nodes(3)=6; nodes(4)=5
252  case (3)
253  nodes(1)=5; nodes(2)=6; nodes(3)=2; nodes(4)=1
254  case (4)
255  nodes(1)=6; nodes(2)=7; nodes(3)=3; nodes(4)=2
256  case (5)
257  nodes(1)=7; nodes(2)=8; nodes(3)=4; nodes(4)=3
258  case (6)
259  nodes(1)=8; nodes(2)=5; nodes(3)=1; nodes(4)=4
260  case default
261  ! error
262  end select
263  case (fe_hex20n)
264  outtype = fe_quad8n
265  select case ( innumber )
266  case (1)
267  nodes(1)=1; nodes(2)=2; nodes(3)=3; nodes(4)=4
268  nodes(5)=9; nodes(6)=10; nodes(7)=11; nodes(8)=12
269  case (2)
270  nodes(1)=8; nodes(2)=7; nodes(3)=6; nodes(4)=5
271  nodes(5)=15; nodes(6)=14; nodes(7)=13; nodes(8)=16
272  case (3)
273  nodes(1)=5; nodes(2)=6; nodes(3)=2; nodes(4)=1
274  nodes(5)=13; nodes(6)=18; nodes(7)=9; nodes(8)=17
275  case (4)
276  nodes(1)=6; nodes(2)=7; nodes(3)=3; nodes(4)=2
277  nodes(5)=14; nodes(6)=19; nodes(7)=10; nodes(8)=18
278  case (5)
279  nodes(1)=7; nodes(2)=8; nodes(3)=4; nodes(4)=3
280  nodes(5)=15; nodes(6)=20; nodes(7)=11; nodes(8)=19
281  case (6)
282  nodes(1)=8; nodes(2)=5; nodes(3)=1; nodes(4)=4
283  nodes(5)=16; nodes(6)=17; nodes(7)=12; nodes(8)=20
284  case default
285  ! error
286  end select
287  case (fe_prism6n)
288  select case ( innumber )
289  case (1)
290  outtype = fe_tri3n
291  nodes(1)=1; nodes(2)=2; nodes(3)=3
292  case (2)
293  outtype = fe_tri3n
294  nodes(1)=6; nodes(2)=5; nodes(3)=4
295  case (3)
296  outtype = fe_quad4n
297  nodes(1)=4; nodes(2)=5; nodes(3)=2; nodes(4)=1
298  case (4)
299  outtype = fe_quad4n
300  nodes(1)=5; nodes(2)=6; nodes(3)=3; nodes(4)=2
301  case (5)
302  outtype = fe_quad4n
303  nodes(1)=6; nodes(2)=4; nodes(3)=1; nodes(4)=3
304  end select
305  case (fe_prism15n)
306  select case ( innumber )
307  case (1)
308  outtype = fe_tri6n
309  nodes(1)=1; nodes(2)=2; nodes(3)=3
310  nodes(4)=7; nodes(5)=8; nodes(6)=9
311  case (2)
312  outtype = fe_tri6n
313  nodes(1)=6; nodes(2)=5; nodes(3)=4
314  nodes(4)=11; nodes(5)=10; nodes(6)=12
315  case (3)
316  outtype = fe_quad8n
317  nodes(1)=4; nodes(2)=5; nodes(3)=2; nodes(4)=1
318  nodes(5)=10; nodes(6)=14; nodes(7)=7; nodes(8)=13
319  case (4)
320  outtype = fe_quad8n
321  nodes(1)=5; nodes(2)=6; nodes(3)=3; nodes(4)=2
322  nodes(5)=11; nodes(6)=15; nodes(7)=8; nodes(8)=14
323  case (5)
324  outtype = fe_quad8n
325  nodes(1)=6; nodes(2)=4; nodes(3)=1; nodes(4)=3
326  nodes(5)=12; nodes(6)=13; nodes(7)=9; nodes(8)=15
327  end select
328  case ( fe_tri3n, fe_mitc3_shell )
329  outtype = fe_line2n
330  select case (innumber )
331  case (1)
332  nodes(1) = 1; nodes(2)=2
333  case (2)
334  nodes(1) = 2; nodes(2)=3
335  case (3)
336  nodes(1) = 3; nodes(2)=1
337  end select
339  outtype = fe_line3n
340  select case (innumber )
341  case (1)
342  nodes(1) = 1; nodes(2)=2; nodes(3)=4
343  case (2)
344  nodes(1) = 2; nodes(2)=3; nodes(3)=5
345  case (3)
346  nodes(1) = 3; nodes(2)=1; nodes(3)=6
347  end select
348  case ( fe_quad4n, fe_mitc4_shell )
349  outtype = fe_line2n
350  select case (innumber )
351  case (1)
352  nodes(1) = 1; nodes(2)=2
353  case (2)
354  nodes(1) = 2; nodes(2)=3
355  case (3)
356  nodes(1) = 3; nodes(2)=4
357  case (4)
358  nodes(1) = 4; nodes(2)=1
359  end select
361  outtype = fe_line3n
362  select case (innumber )
363  case (1)
364  nodes(1) = 1; nodes(2)=2; nodes(3)=5
365  case (2)
366  nodes(1) = 2; nodes(2)=3; nodes(3)=6
367  case (3)
368  nodes(1) = 3; nodes(2)=4; nodes(3)=7
369  case (4)
370  nodes(1) = 4; nodes(2)=1; nodes(3)=8
371  end select
372  case (fe_mitc3_shell361)
373  select case ( innumber )
374  case (1)
375  outtype = fe_tri3n
376  nodes(1)=1; nodes(2)=2; nodes(3)=3
377  case (2)
378  outtype = fe_tri3n
379  nodes(1)=6; nodes(2)=5; nodes(3)=4
380  case (3)
381  outtype = fe_quad4n
382  nodes(1)=4; nodes(2)=5; nodes(3)=2; nodes(4)=1
383  case (4)
384  outtype = fe_quad4n
385  nodes(1)=5; nodes(2)=6; nodes(3)=3; nodes(4)=2
386  case (5)
387  outtype = fe_quad4n
388  nodes(1)=6; nodes(2)=4; nodes(3)=1; nodes(4)=3
389  end select
390  case ( fe_mitc4_shell361 )
391  outtype = fe_quad4n
392  select case ( innumber )
393  case (1)
394  nodes(1)=1; nodes(2)=2; nodes(3)=3; nodes(4)=4
395  case (2)
396  nodes(1)=8; nodes(2)=7; nodes(3)=6; nodes(4)=5
397  case (3)
398  nodes(1)=5; nodes(2)=6; nodes(3)=2; nodes(4)=1
399  case (4)
400  nodes(1)=6; nodes(2)=7; nodes(3)=3; nodes(4)=2
401  case (5)
402  nodes(1)=7; nodes(2)=8; nodes(3)=4; nodes(4)=3
403  case (6)
404  nodes(1)=8; nodes(2)=5; nodes(3)=1; nodes(4)=4
405  case default
406  ! error
407  end select
408  case ( fe_tri3n_patch )
409  outtype = fe_tri3n
410  select case ( innumber )
411  case (1)
412  nodes(1)=1; nodes(2)=2; nodes(3)=3
413  case default
414  !error
415  end select
416  case ( fe_tri6n_patch )
417  outtype = fe_tri6n
418  select case ( innumber )
419  case (1)
420  nodes(1)=1; nodes(2)=2; nodes(3)=3
421  nodes(4)=4; nodes(5)=5; nodes(6)=6
422  case default
423  !error
424  end select
425  case ( fe_quad4n_patch )
426  outtype = fe_quad4n
427  select case ( innumber )
428  case (1)
429  nodes(1)=1; nodes(2)=2; nodes(3)=3; nodes(4)=4
430  case default
431  !error
432  end select
433  case ( fe_quad8n_patch )
434  outtype = fe_quad8n
435  select case ( innumber )
436  case (1)
437  nodes(1)=1; nodes(2)=2; nodes(3)=3; nodes(4)=4
438  nodes(5)=5; nodes(6)=6; nodes(7)=7; nodes(8)=8
439  case default
440  !error
441  end select
442  case default
443  outtype = fe_unknown
444  stop "element type not defined-sbs"
445  ! error message
446  end select
447  end subroutine
448 
450  integer function numofquadpoints( fetype )
451  integer, intent(in) :: fetype
452  select case (fetype)
454  numofquadpoints = 1
455  case ( fe_tri6n )
456  numofquadpoints = 3
457  case ( fe_tri6nc )
458  numofquadpoints = 4
459  case (fe_line3n )
460  numofquadpoints = 2
462  numofquadpoints = 4
463  case ( fe_quad8n, fe_mitc9_shell )
464  numofquadpoints = 9
465  case ( fe_hex8n )
466  numofquadpoints = 8
467  case ( fe_hex20n, fe_mitc8_shell )
468  numofquadpoints = 27
469  case ( fe_prism6n )
470  numofquadpoints = 2
472  numofquadpoints = 3
473  case ( fe_prism15n, fe_tri6n_shell )
474  numofquadpoints = 9
475  case ( fe_tet10n, fe_tet4n_pipi )
476  numofquadpoints = 4
477  case ( fe_tet10nc )
478  numofquadpoints = 12
480  numofquadpoints = 1
481  case default
482  numofquadpoints = -1
483  ! error message
484  stop "element type not defined-np"
485  end select
486  end function
487 
489  integer function numofshellthicknessquadpoints( etype )
490  integer, intent(in) :: etype
491 
492  select case (etype)
495  case (fe_mitc9_shell)
497  case default
499  end select
500  end function numofshellthicknessquadpoints
501 
503  subroutine getshellthicknessquadpoint( etype, np, zeta )
504  use quadrature, only: gauss1d2, gauss1d3
505  integer, intent(in) :: etype, np
506  real(kind=kreal), intent(out) :: zeta
507 
508  if (np < 1 .or. np > numofshellthicknessquadpoints(etype)) then
509  stop "invalid shell thickness quadrature point"
510  endif
511 
512  select case (etype)
514  zeta = gauss1d2(1, np)
515  case (fe_mitc9_shell)
516  zeta = gauss1d3(1, np)
517  end select
518  end subroutine getshellthicknessquadpoint
519 
521  real(kind=kreal) function getshellthicknessweight( etype, np )
522  use quadrature, only: weight1d2, weight1d3
523  integer, intent(in) :: etype, np
524 
525  if (np < 1 .or. np > numofshellthicknessquadpoints(etype)) then
526  stop "invalid shell thickness quadrature point"
527  endif
528 
529  select case (etype)
532  case (fe_mitc9_shell)
534  end select
535  end function getshellthicknessweight
536 
538  subroutine getquadpoint( fetype, np, pos )
539  use quadrature
540  integer, intent(in) :: fetype
541  integer, intent(in) :: np
542  real(kind=kreal), intent(out) :: pos(:)
543 
544  if( np<1 .or. np>numofquadpoints(fetype) ) then
545  ! error
546  endif
547 
548  select case (fetype)
549  case (fe_tri3n)
550  pos(1:2)=gauss2d4(:,np)
551  case ( fe_tri6n, fe_mitc3_shell )
552  pos(1:2)=gauss2d5(:,np)
553  case (fe_tri6nc )
554  pos(1:2)=gauss2d6(:,np)
555  case ( fe_quad4n, fe_mitc4_shell )
556  pos(1:2)=gauss2d2(:,np)
557  case ( fe_quad8n, fe_mitc9_shell )
558  pos(1:2)=gauss2d3(:,np)
559  case ( fe_hex8n, fe_mitc4_shell361 )
560  pos(1:3)=gauss3d2(:,np)
561  case ( fe_hex20n, fe_mitc8_shell )
562  pos(1:3)=gauss3d3(:,np)
563  case ( fe_prism6n, fe_mitc3_shell361 )
564  pos(1:3)=gauss3d7(:,np)
565  case ( fe_prism15n, fe_tri6n_shell )
566  pos(1:3)=gauss3d8(:,np)
567  case ( fe_tet4n, fe_beam341 )
568  pos(1:3)=gauss3d4(:,np)
569  case ( fe_tet10n, fe_tet4n_pipi )
570  pos(1:3)=gauss3d5(:,np)
571  case ( fe_tet10nc )
572  pos(1:3)=np
573  case ( fe_line2n, fe_if_line2n )
574  pos(1:1)=gauss1d1(:,np)
575  case ( fe_line3n )
576  pos(1:1)=gauss1d2(:,np)
577  case default
578  ! error message
579  stop "element type not defined-qp"
580  end select
581  end subroutine
582 
584  real(kind=kreal) function getweight( fetype, np )
585  use quadrature
586  integer, intent(in) :: fetype
587  integer, intent(in) :: np
588  if( np<1 .or. np>numofquadpoints(fetype) ) then
589  ! error
590  endif
591 
592  select case (fetype)
593  case (fe_tri3n)
594  getweight = weight2d4(1)
595  case ( fe_tri6n, fe_mitc3_shell )
596  getweight = weight2d5(np)
597  case ( fe_quad4n, fe_mitc4_shell )
598  getweight = weight2d2(np)
599  case ( fe_quad8n, fe_mitc9_shell )
600  getweight = weight2d3(np)
601  case ( fe_hex8n, fe_mitc4_shell361 )
602  getweight = weight3d2(np)
603  case ( fe_hex20n)
604  getweight = weight3d3(np)
605  case ( fe_prism6n, fe_mitc3_shell361 )
606  getweight = weight3d7(np)
607  case ( fe_prism15n )
608  getweight = weight3d8(np)
609  case ( fe_tet4n, fe_beam341 )
610  getweight = weight3d4(1)
611  case ( fe_tet10n, fe_tet4n_pipi )
612  getweight = weight3d5(np)
613  case ( fe_line2n, fe_if_line2n )
614  getweight = weight1d1(1)
615  case ( fe_line3n )
616  getweight = weight1d2(np)
617  case default
618  getweight = 0.d0
619  ! error message
620  end select
621  end function
622 
623  subroutine getintpoint4ss( fetype, np, pos, n_intp, shapefunc )
624  use quadrature
625  integer, intent(in) :: fetype
626  integer, intent(in) :: np, n_intp
627  real(kind=kreal), intent(out) :: pos(:)
628  real(kind=kreal), intent(out), optional :: shapefunc(:)
629 
630  select case (fetype)
631  case ( fe_tri3n )
632  select case(n_intp)
633  case(27)
634  pos(1:2)=gauss2d27(:,np)
635  end select
636  case ( fe_quad4n )
637  select case(n_intp)
638  case(4)
639  pos(1:2)=gauss2d2(:,np)
640  case(9)
641  pos(1:2)=gauss2d3(:,np)
642  case(16)
643  pos(1:2)=gauss2d16(:,np)
644  end select
645  case default
646  ! error message
647  stop "element type not defined-qp"
648  end select
649 
650  if(present(shapefunc)) call getshapefunc( fetype, pos, shapefunc )
651 
652  end subroutine
653 
654  real(kind=kreal) function getweight_ss( fetype, np, n_intp )
655  use quadrature
656  integer, intent(in) :: fetype
657  integer, intent(in) :: np, n_intp
658 
659  select case (fetype)
660  case (fe_tri3n)
661  select case(n_intp)
662  case(27)
664  end select
665  case ( fe_quad4n, fe_mitc4_shell )
666  select case(n_intp)
667  case(4)
668  getweight_ss = weight2d2(np)
669  case(9)
670  getweight_ss = weight2d3(np)
671  case(16)
673  end select
674  case default
675  ! error message
676  stop "element type not defined-qp"
677  end select
678  end function
679 
680  !************************************
681  ! Following shape function information
682  !************************************
684  subroutine getshapederiv( fetype, localcoord, shapederiv )
685  integer, intent(in) :: fetype
686  real(kind=kreal), intent(in) :: localcoord(:)
687  real(kind=kreal), intent(out) :: shapederiv(:,:)
688 
689  select case (fetype)
690  case ( fe_tri3n, fe_mitc3_shell )
691  !error check
692  call shapederiv_tri3n(shapederiv(1:3,1:2))
693  case (fe_tri6n)
694  !error check
695  call shapederiv_tri6n(localcoord,shapederiv(1:6,1:2) )
696  case ( fe_quad4n, fe_mitc4_shell )
697  !error check
698  call shapederiv_quad4n(localcoord,shapederiv(1:4,1:2))
699  case (fe_quad8n)
700  !error check
701  call shapederiv_quad8n(localcoord,shapederiv(1:8,1:2))
702  case ( fe_mitc9_shell )
703  !error check
704  call shapederiv_quad9n(localcoord,shapederiv(1:9,1:2))
706  ! error check
707  call shapederiv_hex8n(localcoord,shapederiv(1:8,1:3))
708  case (fe_hex20n)
709  ! error check
710  call shapederiv_hex20n(localcoord, shapederiv(1:20,1:3))
712  call shapederiv_prism6n(localcoord,shapederiv(1:6,1:3))
713  case (fe_prism15n)
714  call shapederiv_prism15n(localcoord,shapederiv(1:15,1:3))
716  ! error check
717  call shapederiv_tet4n(shapederiv(1:4,1:3))
718  case (fe_tet10n)
719  ! error check
720  call shapederiv_tet10n(localcoord,shapederiv(1:10,1:3))
721  case default
722  ! error message
723  stop "Element type not defined-sde"
724  end select
725  end subroutine
726 
728  subroutine getshape2ndderiv( fetype, localcoord, shapederiv )
729  integer, intent(in) :: fetype
730  real(kind=kreal), intent(in) :: localcoord(:)
731  real(kind=kreal), intent(out) :: shapederiv(:,:,:)
732 
733  select case (fetype)
734  case ( fe_tri3n, fe_mitc3_shell )
735  !error check
736  call shape2ndderiv_tri3n(shapederiv(1:3,1:2,1:2))
737  case (fe_tri6n)
738  !error check
739  call shape2ndderiv_tri6n(shapederiv(1:6,1:2,1:2))
740  case ( fe_quad4n, fe_mitc4_shell )
741  !error check
742  call shape2ndderiv_quad4n(shapederiv(1:4,1:2,1:2))
743  case (fe_quad8n)
744  !error check
745  call shape2ndderiv_quad8n(localcoord,shapederiv(1:8,1:2,1:2))
746  case default
747  ! error message
748  stop "Cannot calculate second derivatives of shape function"
749  end select
750  end subroutine
751 
753  subroutine getshapefunc( fetype, localcoord, func )
754  integer, intent(in) :: fetype
755  real(kind=kreal), intent(in) :: localcoord(:)
756  real(kind=kreal), intent(out) :: func(:)
757 
758  select case (fetype)
759  case ( fe_tri3n, fe_mitc3_shell )
760  !error check
761  call shapefunc_tri3n(localcoord,func(1:3))
762  case (fe_tri6n)
763  !error check
764  call shapefunc_tri6n(localcoord,func(1:6))
765  case ( fe_quad4n, fe_mitc4_shell )
766  !error check
767  call shapefunc_quad4n(localcoord,func(1:4))
768  case (fe_quad8n)
769  !error check
770  call shapefunc_quad8n(localcoord,func(1:8))
772  ! error check
773  call shapefunc_hex8n(localcoord,func(1:8))
774  case ( fe_mitc9_shell )
775  !error check
776  call shapefunc_quad9n(localcoord,func(1:9))
777  case (fe_hex20n)
778  ! error check
779  call shapefunc_hex20n(localcoord,func(1:20))
781  call shapefunc_prism6n(localcoord,func(1:6))
782  case (fe_prism15n)
783  call shapefunc_prism15n(localcoord,func(1:15))
785  ! error check
786  call shapefunc_tet4n(localcoord,func(1:4))
787  case (fe_tet10n)
788  ! error check
789  call shapefunc_tet10n(localcoord,func(1:10))
790  case (fe_line2n, fe_if_line2n)
791  !error check
792  call shapefunc_line2n(localcoord,func(1:2))
793  case (fe_line3n)
794  !error check
795  call shapefunc_line3n(localcoord,func(1:3))
796  case default
797  stop "Element type not defined-sf"
798  ! error message
799  end select
800  end subroutine
801 
802 
803  ! (Gaku Hashimoto, The University of Tokyo, 2012/11/15) <
804  !####################################################################
805  subroutine getnodalnaturalcoord(fetype, nncoord)
806  !####################################################################
807 
808  integer, intent(in) :: fetype
809  real(kind = kreal), intent(out) :: nncoord(:, :)
810 
811  !--------------------------------------------------------------------
812 
813  select case( fetype )
815 
816  !error check
817  call nodalnaturalcoord_tri3n( nncoord(1:3, 1:2) )
818 
820 
821  !error check
822  call nodalnaturalcoord_quad4n( nncoord(1:4, 1:2) )
823 
824  case( fe_mitc9_shell )
825 
826  !error check
827  call nodalnaturalcoord_quad9n( nncoord(1:9, 1:2) )
828 
829  case default
830 
831  ! error message
832  stop "Element type not defined-sde"
833 
834  end select
835 
836  !--------------------------------------------------------------------
837 
838  return
839 
840  !####################################################################
841  end subroutine getnodalnaturalcoord
842  !####################################################################
843  ! > (Gaku Hashimoto, The University of Tokyo, 2012/11/15)
844 
845 
847  subroutine getglobalderiv( fetype, nn, localcoord, elecoord, det, gderiv )
848  integer, intent(in) :: fetype
849  integer, intent(in) :: nn
850  real(kind=kreal), intent(in) :: localcoord(:)
851  real(kind=kreal), intent(in) :: elecoord(:,:)
852  real(kind=kreal), intent(out) :: det
853  real(kind=kreal), intent(out) :: gderiv(:,:)
854 
855  real(kind=kreal) :: dum, xj(3,3), xji(3,3), deriv(nn,3)
856  integer :: nspace
857 
858  nspace = getspacedimension( fetype )
859  call getshapederiv( fetype, localcoord(:), deriv(1:nn,:) )
860 
861  if( nspace==2 ) then
862  xj(1:2,1:2)=matmul( elecoord(1:2,1:nn), deriv(1:nn,1:2) )
863  det=xj(1,1)*xj(2,2)-xj(2,1)*xj(1,2)
864  if( det==0.d0 ) stop "Math error in GetGlobalDeriv! Determinant==0.0"
865  dum=1.d0/det
866  xji(1,1)= xj(2,2)*dum
867  xji(1,2)=-xj(1,2)*dum
868  xji(2,1)=-xj(2,1)*dum
869  xji(2,2)= xj(1,1)*dum
870  else
871  ! JACOBI MATRIX
872  xj(1:3,1:3)= matmul( elecoord(1:3,1:nn), deriv(1:nn,1:3) )
873  !DETERMINANT OF JACOBIAN
874  det=xj(1,1)*xj(2,2)*xj(3,3) &
875  +xj(2,1)*xj(3,2)*xj(1,3) &
876  +xj(3,1)*xj(1,2)*xj(2,3) &
877  -xj(3,1)*xj(2,2)*xj(1,3) &
878  -xj(2,1)*xj(1,2)*xj(3,3) &
879  -xj(1,1)*xj(3,2)*xj(2,3)
880  if( det==0.d0 ) stop "Math error in GetGlobalDeriv! Determinant==0.0"
881  ! INVERSION OF JACOBIAN
882  dum=1.d0/det
883  xji(1,1)=dum*( xj(2,2)*xj(3,3)-xj(3,2)*xj(2,3) )
884  xji(1,2)=dum*(-xj(1,2)*xj(3,3)+xj(3,2)*xj(1,3) )
885  xji(1,3)=dum*( xj(1,2)*xj(2,3)-xj(2,2)*xj(1,3) )
886  xji(2,1)=dum*(-xj(2,1)*xj(3,3)+xj(3,1)*xj(2,3) )
887  xji(2,2)=dum*( xj(1,1)*xj(3,3)-xj(3,1)*xj(1,3) )
888  xji(2,3)=dum*(-xj(1,1)*xj(2,3)+xj(2,1)*xj(1,3) )
889  xji(3,1)=dum*( xj(2,1)*xj(3,2)-xj(3,1)*xj(2,2) )
890  xji(3,2)=dum*(-xj(1,1)*xj(3,2)+xj(3,1)*xj(1,2) )
891  xji(3,3)=dum*( xj(1,1)*xj(2,2)-xj(2,1)*xj(1,2) )
892  endif
893 
894  gderiv(1:nn,1:nspace)=matmul( deriv(1:nn,1:nspace), xji(1:nspace,1:nspace) )
895  end subroutine
896 
898  real(kind=kreal) function getdeterminant( fetype, nn, localcoord, elecoord )
899  integer, intent(in) :: fetype
900  integer, intent(in) :: nn
901  real(kind=kreal), intent(in) :: localcoord(:)
902  real(kind=kreal), intent(in) :: elecoord(:,:)
903 
904  real(kind=kreal) :: xj(3,3), deriv(nn,3)
905  integer :: nspace
906 
907  nspace = getspacedimension( fetype )
908  call getshapederiv( fetype, localcoord(:), deriv(1:nn,:) )
909 
910  if( nspace==2 ) then
911  xj(1:2,1:2)=matmul( elecoord(1:2,1:nn), deriv(1:nn,1:2) )
912  getdeterminant=xj(1,1)*xj(2,2)-xj(2,1)*xj(1,2)
913  else
914  xj(1:3,1:3)= matmul( elecoord(1:3,1:nn), deriv(1:nn,1:3) )
915  getdeterminant=xj(1,1)*xj(2,2)*xj(3,3) &
916  +xj(2,1)*xj(3,2)*xj(1,3) &
917  +xj(3,1)*xj(1,2)*xj(2,3) &
918  -xj(3,1)*xj(2,2)*xj(1,3) &
919  -xj(2,1)*xj(1,2)*xj(3,3) &
920  -xj(1,1)*xj(3,2)*xj(2,3)
921  endif
922 
923  end function
924 
926  subroutine getjacobian( fetype, nn, localcoord, elecoord, det, jacobian, inverse )
927  integer, intent(in) :: fetype
928  integer, intent(in) :: nn
929  real(kind=kreal), intent(in) :: localcoord(:)
930  real(kind=kreal), intent(in) :: elecoord(:,:)
931  real(kind=kreal), intent(out) :: det
932  real(kind=kreal), intent(out) :: jacobian(:,:)
933  real(kind=kreal), intent(out) :: inverse(:,:)
934 
935  real(kind=kreal) :: dum, deriv(nn,3)
936  integer :: nspace
937 
938  nspace = getspacedimension( fetype )
939  call getshapederiv( fetype, localcoord(:), deriv(1:nn,:) )
940 
941  if( nspace==2 ) then
942  jacobian(1:2,1:2)=matmul( elecoord(1:2,1:nn), deriv(1:nn,1:2) )
943  det=jacobian(1,1)*jacobian(2,2)-jacobian(2,1)*jacobian(1,2)
944  if( det==0.d0 ) stop "Math error in getJacobain! Determinant==0.0"
945  dum=1.0/det
946  inverse(1,1)= jacobian(2,2)*dum
947  inverse(1,2)=-jacobian(1,2)*dum
948  inverse(2,1)=-jacobian(2,1)*dum
949  inverse(2,2)= jacobian(1,1)*dum
950  else
951  ! JACOBI MATRIX
952  jacobian(1:3,1:3)= matmul( elecoord(1:3,1:nn), deriv(1:nn,1:3) )
953  !DETERMINANT OF JACOBIAN
954  det=jacobian(1,1)*jacobian(2,2)*jacobian(3,3) &
955  +jacobian(2,1)*jacobian(3,2)*jacobian(1,3) &
956  +jacobian(3,1)*jacobian(1,2)*jacobian(2,3) &
957  -jacobian(3,1)*jacobian(2,2)*jacobian(1,3) &
958  -jacobian(2,1)*jacobian(1,2)*jacobian(3,3) &
959  -jacobian(1,1)*jacobian(3,2)*jacobian(2,3)
960  if( det==0.d0 ) stop "Math error in getJacobain! Determinant==0.0"
961  ! INVERSION OF JACOBIAN
962  dum=1.d0/det
963  inverse(1,1)=dum*( jacobian(2,2)*jacobian(3,3)-jacobian(3,2)*jacobian(2,3) )
964  inverse(1,2)=dum*(-jacobian(1,2)*jacobian(3,3)+jacobian(3,2)*jacobian(1,3) )
965  inverse(1,3)=dum*( jacobian(1,2)*jacobian(2,3)-jacobian(2,2)*jacobian(1,3) )
966  inverse(2,1)=dum*(-jacobian(2,1)*jacobian(3,3)+jacobian(3,1)*jacobian(2,3) )
967  inverse(2,2)=dum*( jacobian(1,1)*jacobian(3,3)-jacobian(3,1)*jacobian(1,3) )
968  inverse(2,3)=dum*(-jacobian(1,1)*jacobian(2,3)+jacobian(2,1)*jacobian(1,3) )
969  inverse(3,1)=dum*( jacobian(2,1)*jacobian(3,2)-jacobian(3,1)*jacobian(2,2) )
970  inverse(3,2)=dum*(-jacobian(1,1)*jacobian(3,2)+jacobian(3,1)*jacobian(1,2) )
971  inverse(3,3)=dum*( jacobian(1,1)*jacobian(2,2)-jacobian(2,1)*jacobian(1,2) )
972  endif
973  end subroutine
974 
975  subroutine getsurfacejacobian_det(fetype, nn, localcoord, elecoord, det)
976  integer, intent(in) :: fetype
977  integer, intent(in) :: nn
978  real(kind=kreal), intent(in) :: localcoord(:)
979  real(kind=kreal), intent(in) :: elecoord(:,:)
980  real(kind=kreal), intent(out) :: det
981  real(kind=kreal) :: g1(3), g2(3), n(3), deriv(nn,2)
982  integer :: i, j
983 
984  call getshapederiv( fetype, localcoord(:), deriv(:,:) )
985  g1 = 0.0d0
986  g2 = 0.0d0
987  do i = 1, 3
988  do j = 1, nn
989  g1(i) = g1(i) + deriv(j,1) * elecoord(i,j)
990  g2(i) = g2(i) + deriv(j,2) * elecoord(i,j)
991  end do
992  end do
993 
994  call cross_product(g1, g2, n)
995  det = dsqrt(dot_product(n,n))
996  end subroutine
997 
998  subroutine get_intp_weights(etype, nn, n_intp, elecoord, weight)
999  integer, intent(in) :: etype
1000  integer, intent(in) :: nn, n_intp
1001  real(kind=kreal), intent(in) :: elecoord(:,:)
1002  real(kind=kreal), intent(out) :: weight(:)
1003  integer :: intp
1004  real(kind=kreal) :: ncoord(2), det
1005 
1006  ncoord = 0.d0; det = 0.d0
1007  do intp = 1, n_intp
1008  call getintpoint4ss( etype, intp, ncoord, n_intp)
1009  call getsurfacejacobian_det( etype, nn, ncoord, elecoord, det )
1010  weight(intp) = getweight_ss(etype, intp, n_intp) * det
1011  enddo
1012  end subroutine
1013 
1015  function surfacenormal( fetype, nn, localcoord, elecoord ) result( normal )
1016  integer, intent(in) :: fetype
1017  integer, intent(in) :: nn
1018  real(kind=kreal), intent(in) :: localcoord(2)
1019  real(kind=kreal), intent(in) :: elecoord(3,nn)
1020  real(kind=kreal) :: normal(3)
1021  real(kind=kreal) :: deriv(nn,2), gderiv(3,2)
1022 
1023  select case (fetype)
1024  case (fe_tri3n)
1025  !error check
1026  call shapederiv_tri3n(deriv(1:3,1:2))
1027  case (fe_tri6n)
1028  !error check
1029  call shapederiv_tri6n(localcoord,deriv(1:6,1:2))
1030  case (fe_quad4n)
1031  !error check
1032  call shapederiv_quad4n(localcoord,deriv(1:4,1:2))
1033  case (fe_quad8n)
1034  !error check
1035  call shapederiv_quad8n(localcoord,deriv(1:8,1:2))
1036  case default
1037  ! error message
1038  normal =0.d0
1039  return
1040  end select
1041 
1042  gderiv = matmul( elecoord, deriv )
1043  normal(1) = gderiv(2,1)*gderiv(3,2) - gderiv(3,1)*gderiv(2,2)
1044  normal(2) = gderiv(3,1)*gderiv(1,2) - gderiv(1,1)*gderiv(3,2)
1045  normal(3) = gderiv(1,1)*gderiv(2,2) - gderiv(2,1)*gderiv(1,2)
1046  ! normal = normal/dsqrt(dot_product(normal, normal))
1047  end function
1048 
1050  function edgenormal( fetype, nn, localcoord, elecoord ) result( normal )
1051  integer, intent(in) :: fetype
1052  integer, intent(in) :: nn
1053  real(kind=kreal), intent(in) :: localcoord(1)
1054  real(kind=kreal), intent(in) :: elecoord(2,nn)
1055  real(kind=kreal) :: normal(2)
1056  real(kind=kreal) :: deriv(nn,1), gderiv(2,1)
1057 
1058  select case (fetype)
1059  case (fe_line2n, fe_if_line2n)
1060  !error check
1061  call shapederiv_line2n(deriv(1:nn,:))
1062  case (fe_line3n)
1063  !error check
1064  call shapederiv_line3n(localcoord,deriv(1:nn,:))
1065  case default
1066  ! error message
1067  normal =0.d0
1068  return
1069  end select
1070 
1071  gderiv = matmul( elecoord, deriv )
1072  normal(1) = -gderiv(2,1)
1073  normal(2) = gderiv(1,1)
1074  ! normal = normal/dsqrt(dot_product(normal, normal))
1075  end function
1076 
1078  subroutine tangentbase( fetype, nn, localcoord, elecoord, tangent )
1079  integer, intent(in) :: fetype
1080  integer, intent(in) :: nn
1081  real(kind=kreal), intent(in) :: localcoord(2)
1082  real(kind=kreal), intent(in) :: elecoord(3,nn)
1083  real(kind=kreal), intent(out) :: tangent(3,2)
1084  real(kind=kreal) :: deriv(nn,2)
1085 
1086  select case (fetype)
1087  case (fe_tri3n)
1088  !error check
1089  call shapederiv_tri3n(deriv(1:3,1:2))
1090  case (fe_tri6n)
1091  !error check
1092  call shapederiv_tri6n(localcoord,deriv(1:6,1:2))
1093  case (fe_tri6nc)
1094  !error check
1095  call shapederiv_tri6n(localcoord,deriv(1:6,1:2))
1096  case (fe_quad4n)
1097  !error check
1098  call shapederiv_quad4n(localcoord,deriv(1:4,1:2))
1099  case (fe_quad8n)
1100  !error check
1101  call shapederiv_quad8n(localcoord,deriv(1:8,1:2))
1102  case default
1103  ! error message
1104  tangent =0.d0
1105  return
1106  end select
1107 
1108  tangent = matmul( elecoord, deriv )
1109  end subroutine tangentbase
1110 
1112  subroutine curvature( fetype, nn, localcoord, elecoord, l2ndderiv, normal, curv )
1113  integer, intent(in) :: fetype
1114  integer, intent(in) :: nn
1115  real(kind=kreal), intent(in) :: localcoord(2)
1116  real(kind=kreal), intent(in) :: elecoord(3,nn)
1117  real(kind=kreal), intent(out) :: l2ndderiv(3,2,2)
1118  real(kind=kreal), intent(in), optional :: normal(3)
1119  real(kind=kreal), intent(out), optional :: curv(2,2)
1120  real(kind=kreal) :: deriv2(nn,2,2)
1121 
1122  select case (fetype)
1123  case (fe_tri3n)
1124  !error check
1125  call shape2ndderiv_tri3n(deriv2(1:3,1:2,1:2))
1126  case (fe_tri6n)
1127  !error check
1128  call shape2ndderiv_tri6n(deriv2(1:6,1:2,1:2))
1129  case (fe_tri6nc)
1130  !error check
1131  call shape2ndderiv_tri6n(deriv2(1:6,1:2,1:2))
1132  ! deriv2=0.d0
1133  case (fe_quad4n)
1134  !error check
1135  call shape2ndderiv_quad4n(deriv2(1:4,1:2,1:2))
1136  case (fe_quad8n)
1137  !error check
1138  call shape2ndderiv_quad8n(localcoord,deriv2(1:8,1:2,1:2))
1139  case default
1140  ! error message
1141  stop "Cannot calculate second derivatives of shape function"
1142  end select
1143 
1144  l2ndderiv(1:3,1,1) = matmul( elecoord(1:3,1:nn), deriv2(1:nn,1,1) )
1145  l2ndderiv(1:3,1,2) = matmul( elecoord(1:3,1:nn), deriv2(1:nn,1,2) )
1146  l2ndderiv(1:3,2,1) = matmul( elecoord(1:3,1:nn), deriv2(1:nn,2,1) )
1147  l2ndderiv(1:3,2,2) = matmul( elecoord(1:3,1:nn), deriv2(1:nn,2,2) )
1148  if( present(curv) ) then
1149  curv(1,1) = dot_product( l2ndderiv(:,1,1), normal(:) )
1150  curv(1,2) = dot_product( l2ndderiv(:,1,2), normal(:) )
1151  curv(2,1) = dot_product( l2ndderiv(:,2,1), normal(:) )
1152  curv(2,2) = dot_product( l2ndderiv(:,2,2), normal(:) )
1153  endif
1154  end subroutine curvature
1155 
1157  subroutine getelementcenter( fetype, localcoord )
1158  integer, intent(in) :: fetype
1159  real(kind=kreal), intent(out) :: localcoord(:)
1160 
1161  select case (fetype)
1162  case (fe_tri3n, fe_tri6n, fe_tri6nc)
1163  localcoord(1:2) = 1.d0/3.d0
1164  case (fe_quad4n, fe_quad8n)
1165  localcoord(1:2) = 0.d0
1166  case (fe_tet4n, fe_tet10n, fe_tet10nc)
1167  localcoord(1:3) = 1.d0/4.d0
1168  case (fe_prism6n, fe_prism15n)
1169  localcoord(1) = 1.d0/3.d0
1170  localcoord(2) = 1.d0/3.d0
1171  localcoord(3) = 0.d0
1172  case (fe_hex8n, fe_hex20n, fe_hex27n)
1173  localcoord(1:3) = 0.d0
1174  case default
1175  localcoord(:) = 0.d0
1176  end select
1177  end subroutine getelementcenter
1178 
1181  integer function isinsideelement( fetype, localcoord, clearance )
1182  integer, intent(in) :: fetype
1183  real(kind=kreal), intent(inout) :: localcoord(2)
1184  real(kind=kreal), optional :: clearance
1185  real(kind=kreal) :: clr, coord3
1186 
1187  clr = 1.d-6
1188  if( present(clearance) ) clr = clearance
1189  if( dabs(localcoord(1))<clr ) localcoord(1)=0.d0
1190  if( dabs(localcoord(2))<clr ) localcoord(2)=0.d0
1191  if( dabs(dabs(localcoord(1))-1.d0)<clr ) &
1192  localcoord(1)=sign(1.d0,localcoord(1))
1193  if( dabs(dabs(localcoord(2))-1.d0)<clr ) &
1194  localcoord(2)=sign(1.d0,localcoord(2))
1195  isinsideelement = -1
1196  select case (fetype)
1197  case (fe_tri3n, fe_tri6n, fe_tri6nc)
1198  !error check
1199  coord3 = 1.d0-(localcoord(1)+localcoord(2))
1200  if( dabs(coord3)<clr ) coord3=0.d0
1201  if( localcoord(1)>=0.d0 .and. localcoord(1)<=1.d0 .and. &
1202  localcoord(2)>=0.d0 .and. localcoord(2)<=1.d0 .and. &
1203  coord3>=0.d0 .and. coord3<=1.d0 ) then
1204  isinsideelement = 0
1205  if( localcoord(1)==1.d0 ) then
1206  isinsideelement = 1
1207  elseif( localcoord(2)==1.d0 ) then
1208  isinsideelement = 2
1209  elseif( coord3==1.d0 ) then
1210  isinsideelement = 3
1211  elseif( coord3==0.d0 ) then
1212  isinsideelement = 12
1213  elseif( localcoord(1)==0.d0 ) then
1214  isinsideelement = 23
1215  elseif( localcoord(2)==0.d0 ) then
1216  isinsideelement = 31
1217  endif
1218  endif
1219  case (fe_quad4n, fe_quad8n)
1220  !error check
1221  if( all(dabs(localcoord)<=1.d0) ) then
1222  isinsideelement = 0
1223  if( localcoord(1)==-1.d0 .and. localcoord(2)==-1.d0 ) then
1224  isinsideelement = 1
1225  elseif( localcoord(1)==1.d0 .and. localcoord(2)==-1.d0 ) then
1226  isinsideelement = 2
1227  elseif( localcoord(1)==1.d0 .and. localcoord(2)==1.d0 ) then
1228  isinsideelement = 3
1229  elseif( localcoord(1)==-1.d0 .and. localcoord(2)==1.d0 ) then
1230  isinsideelement = 4
1231  elseif( localcoord(2)==-1.d0 ) then
1232  isinsideelement = 12
1233  elseif( localcoord(1)==1.d0 ) then
1234  isinsideelement = 23
1235  elseif( localcoord(2)==1.d0 ) then
1236  isinsideelement = 34
1237  elseif( localcoord(1)==-1.d0 ) then
1238  isinsideelement = 41
1239  endif
1240  endif
1241  end select
1242  end function isinsideelement
1243 
1246  integer function isinside3delement( fetype, localcoord, clearance )
1247  integer, intent(in) :: fetype
1248  real(kind=kreal), intent(inout) :: localcoord(3)
1249  real(kind=kreal), optional :: clearance
1250  real(kind=kreal) :: clr, coord4
1251 
1252  integer :: idof
1253 
1254  clr = 1.d-6
1255  if( present(clearance) ) clr = clearance
1256  do idof=1,3
1257  if( dabs(localcoord(idof))<clr ) localcoord(idof)=0.d0
1258  if( dabs(dabs(localcoord(idof))-1.d0)<clr ) &
1259  & localcoord(idof)=sign(1.d0,localcoord(idof))
1260  enddo
1261 
1262  isinside3delement = -1
1263  select case (fetype)
1265  !error check
1266  coord4 = 1.d0-(localcoord(1)+localcoord(2)+localcoord(3))
1267  if( dabs(coord4)<clr ) coord4=0.d0
1268  isinside3delement = 0
1269  do idof=1,3
1270  if( localcoord(idof) < 0.d0 .or. localcoord(idof) > 1.d0 ) isinside3delement = -1
1271  enddo
1272  if( coord4 < 0.d0 .or. coord4 > 1.d0 ) isinside3delement = -1
1273  case (fe_prism6n, fe_prism15n)
1274  !error check
1275  coord4 = 1.d0-(localcoord(1)+localcoord(2))
1276  isinside3delement = 0
1277  do idof=1,2
1278  if( localcoord(idof) < 0.d0 .or. localcoord(idof) > 1.d0 ) isinside3delement = -1
1279  enddo
1280  if( localcoord(3) < -1.d0 .or. localcoord(3) > 1.d0 ) isinside3delement = -1
1281  if( coord4 < 0.d0 .or. coord4 > 1.d0 ) isinside3delement = -1
1282  case (fe_hex8n, fe_hex20n, fe_hex27n)
1283  if( all(dabs(localcoord)<=1.d0) ) isinside3delement = 0
1284  end select
1285  end function
1286 
1288  subroutine getvertexcoord( fetype, cnode, localcoord )
1289  integer, intent(in) :: fetype
1290  integer, intent(in) :: cnode
1291  real(kind=kreal), intent(out) :: localcoord(2)
1292 
1293  select case (fetype)
1294  case (fe_tri3n, fe_tri6n, fe_tri6nc)
1295  if( cnode==1 ) then
1296  localcoord(1) =1.d0
1297  localcoord(2) =0.d0
1298  elseif( cnode==2 ) then
1299  localcoord(1) =0.d0
1300  localcoord(2) =1.d0
1301  else
1302  localcoord(1) =0.d0
1303  localcoord(2) =0.d0
1304  endif
1305  case (fe_quad4n, fe_quad8n)
1306  if( cnode==1 ) then
1307  localcoord(1) =-1.d0
1308  localcoord(2) =-1.d0
1309  elseif( cnode==2 ) then
1310  localcoord(1) =1.d0
1311  localcoord(2) =-1.d0
1312  elseif( cnode==3 ) then
1313  localcoord(1) =1.d0
1314  localcoord(2) =1.d0
1315  else
1316  localcoord(1) =-1.d0
1317  localcoord(2) =1.d0
1318  endif
1319  end select
1320  end subroutine
1321 
1323  subroutine extrapolatevalue( lpos, fetype, nnode, pvalue, ndvalue )
1324  real(kind=kreal), intent(in) :: lpos(:)
1325  integer, intent(in) :: fetype
1326  integer, intent(in) :: nnode
1327  real(kind=kreal), intent(in) :: pvalue(:)
1328  real(kind=kreal), intent(out) :: ndvalue(:,:)
1329 
1330  integer :: i
1331  real(kind=kreal) :: shapefunc(nnode)
1332  call getshapefunc( fetype, lpos, shapefunc )
1333  do i=1,nnode
1334  ndvalue(i,:) = shapefunc(i)*pvalue(:)
1335  enddo
1336  end subroutine
1337 
1339  subroutine interapolatevalue( lpos, fetype, nnode, pvalue, ndvalue )
1340  real(kind=kreal), intent(in) :: lpos(:)
1341  integer, intent(in) :: fetype
1342  integer, intent(in) :: nnode
1343  real(kind=kreal), intent(out) :: pvalue(:)
1344  real(kind=kreal), intent(in) :: ndvalue(:,:)
1345 
1346  integer :: i
1347  real(kind=kreal) :: shapefunc(nnode)
1348  call getshapefunc( fetype, lpos, shapefunc )
1349  pvalue(:) = 0
1350  do i=1,nnode
1351  pvalue(:) = pvalue(:)+ shapefunc(i)*ndvalue(i,:)
1352  enddo
1353  end subroutine
1354 
1356  subroutine gauss2node( fetype, gaussv, nodev )
1357  integer, intent(in) :: fetype
1358  real(kind=kreal), intent(in) :: gaussv(:,:)
1359  real(kind=kreal), intent(out) :: nodev(:,:)
1360 
1361  integer :: i, ngauss, nnode
1362  real(kind=kreal) :: localcoord(3), func(100)
1363  ngauss = numofquadpoints( fetype )
1364  nnode = getnumberofnodes( fetype )
1365  ! error checking
1366  select case (fetype)
1367  case (fe_tri3n)
1368  !error check
1369  do i=1,nnode
1370  nodev(i,:) = gaussv(1,:)
1371  enddo
1372  case (fe_tri6n)
1373  !error check
1374  ! func(1:6) = ShapeFunc_tri6n(localcoord)
1375  case (fe_quad4n)
1376  !error check
1377  ! nodev(:,:) = gaussv(1,:)
1378  case (fe_quad8n)
1379  !error check
1380  call shapefunc_quad8n(localcoord,func(1:8))
1381  case (fe_hex8n, fe_mitc4_shell361)
1382  ! error check
1383  call shapefunc_hex8n(localcoord,func(1:8))
1384  case (fe_hex20n)
1385  ! error check
1386  call shapefunc_hex20n(localcoord,func(1:20))
1388  do i=1,3
1389  nodev(i,:) = gaussv(1,:)
1390  enddo
1391  do i=1,3
1392  nodev(i+3,:) = gaussv(2,:)
1393  enddo
1394  case (fe_prism15n)
1395  call shapefunc_prism15n(localcoord,func(1:15))
1397  ! error check
1398  do i=1,nnode
1399  nodev(i,:) = gaussv(1,:)
1400  enddo
1401  case (fe_tet10n)
1402  ! error check
1403  call shapefunc_tet10n(localcoord,func(1:10))
1404  case default
1405  stop "Element type not defined"
1406  ! error message
1407  end select
1408  end subroutine
1409 
1411  real(kind=kreal) function getreferencelength( fetype, nn, localcoord, elecoord )
1412  integer, intent(in) :: fetype
1413  integer, intent(in) :: nn
1414  real(kind=kreal),intent(in) :: localcoord(2)
1415  real(kind=kreal),intent(in) :: elecoord(3,nn)
1416  real(kind=kreal) :: detjxy, detjyz, detjxz, detj
1417  detjxy = getdeterminant( fetype, nn, localcoord, elecoord(1:2,1:nn) )
1418  detjyz = getdeterminant( fetype, nn, localcoord, elecoord(2:3,1:nn) )
1419  detjxz = getdeterminant( fetype, nn, localcoord, elecoord(1:3:2,1:nn) )
1420  detj = dsqrt( detjxy **2 + detjyz **2 + detjxz **2 )
1421  getreferencelength = dsqrt( detj )
1422  end function getreferencelength
1423 
1424 
1425 end module
This module encapsulate the basic functions of all elements provide by this software.
Definition: element.f90:43
subroutine getshapefunc(fetype, localcoord, func)
Calculate the shape function in natural coordinate system.
Definition: element.f90:754
subroutine getjacobian(fetype, nn, localcoord, elecoord, det, jacobian, inverse)
calculate Jacobian matrix, its determinant and inverse
Definition: element.f90:927
integer(kind=kind(2)) function getnumberofnodes(etype)
Obtain number of nodes of the element.
Definition: element.f90:132
integer, parameter fe_beam341
Definition: element.f90:90
real(kind=kreal) function getweight_ss(fetype, np, n_intp)
Definition: element.f90:655
integer, parameter fe_if_line2n
Definition: element.f90:86
integer function isinside3delement(fetype, localcoord, clearance)
if a point is inside a surface element -1: No; 0: Yes; >0: Node's (vertex) number
Definition: element.f90:1247
integer, parameter fe_tri3n_patch
Definition: element.f90:105
subroutine getsurfacejacobian_det(fetype, nn, localcoord, elecoord, det)
Definition: element.f90:976
integer, parameter fe_unknown
Definition: element.f90:66
real(kind=kreal) function, dimension(2) edgenormal(fetype, nn, localcoord, elecoord)
Calculate normal of 2d-edge.
Definition: element.f90:1051
subroutine getquadpoint(fetype, np, pos)
Fetch the coordinate of gauss point.
Definition: element.f90:539
subroutine getglobalderiv(fetype, nn, localcoord, elecoord, det, gderiv)
Calculate shape derivative in global coordinate system.
Definition: element.f90:848
integer, parameter fe_line2n
Definition: element.f90:68
subroutine getelementcenter(fetype, localcoord)
Return natural coordinate of the center of element.
Definition: element.f90:1158
integer, parameter fe_tri6n
Definition: element.f90:71
integer, parameter fe_prism6n
Definition: element.f90:80
integer, parameter fe_tet10nc
Definition: element.f90:79
integer(kind=kind(2)) function getnumberofsubface(etype)
Obtain number of sub-surface.
Definition: element.f90:169
subroutine getshellthicknessquadpoint(etype, np, zeta)
Fetch the through-thickness quadrature coordinate of a shell element.
Definition: element.f90:504
subroutine getsubface(intype, innumber, outtype, nodes)
Find the definition of surface of the element.
Definition: element.f90:194
integer, parameter fe_dsg3_shell
Definition: element.f90:93
subroutine getshapederiv(fetype, localcoord, shapederiv)
Calculate derivatives of shape function in natural coordinate system.
Definition: element.f90:685
integer, parameter fe_mitc3_shell361
Definition: element.f90:99
integer, parameter fe_prism15n
Definition: element.f90:81
integer function numofshellthicknessquadpoints(etype)
Obtains the number of through-thickness quadrature points of a shell element.
Definition: element.f90:490
subroutine getvertexcoord(fetype, cnode, localcoord)
Get the natural coord of a vertex node.
Definition: element.f90:1289
integer, parameter fe_hex20n
Definition: element.f90:83
integer, parameter fe_quad8n_patch
Definition: element.f90:108
subroutine get_intp_weights(etype, nn, n_intp, elecoord, weight)
Definition: element.f90:999
integer, parameter fe_nodesmooth_tet4n
Definition: element.f90:102
integer, parameter fe_tri3n
Definition: element.f90:70
real(kind=kreal) function getdeterminant(fetype, nn, localcoord, elecoord)
Calculate shape derivative in global coordinate system.
Definition: element.f90:899
subroutine tangentbase(fetype, nn, localcoord, elecoord, tangent)
Calculate base vector of tangent space of 3d surface.
Definition: element.f90:1079
integer, parameter fe_mitc4_shell
Definition: element.f90:95
integer, parameter fe_hex27n
Definition: element.f90:84
integer, parameter fe_truss
Definition: element.f90:75
integer, parameter fe_mitc9_shell
Definition: element.f90:97
integer, parameter fe_tet4n_pipi
Definition: element.f90:77
subroutine getshape2ndderiv(fetype, localcoord, shapederiv)
Calculate the 2nd derivative of shape function in natural coordinate system.
Definition: element.f90:729
real(kind=kreal) function getweight(fetype, np)
Fetch the weight value in given gauss point.
Definition: element.f90:585
integer, parameter fe_mitc4_shell361
Definition: element.f90:100
integer, parameter fe_quad4n
Definition: element.f90:73
integer, parameter fe_mitc8_shell
Definition: element.f90:96
integer, parameter fe_hex8n
Definition: element.f90:82
integer, parameter fe_tri6n_patch
Definition: element.f90:106
integer function numofquadpoints(fetype)
Obtains the number of quadrature points of the element.
Definition: element.f90:451
integer(kind=kind(2)) function getspacedimension(etype)
Obtain the space dimension of the element.
Definition: element.f90:118
subroutine extrapolatevalue(lpos, fetype, nnode, pvalue, ndvalue)
This subroutine extrapolate a point value into elemental nodes.
Definition: element.f90:1324
integer function isinsideelement(fetype, localcoord, clearance)
if a point is inside a surface element -1: No; 0: Yes; >0: Node's (vertex) number
Definition: element.f90:1182
integer, parameter fe_mitc3_shell
Definition: element.f90:94
integer, parameter fe_tri6nc
Definition: element.f90:72
real(kind=kreal) function, dimension(3) surfacenormal(fetype, nn, localcoord, elecoord)
Calculate normal of 3d-surface.
Definition: element.f90:1016
subroutine getnodalnaturalcoord(fetype, nncoord)
Definition: element.f90:806
integer, parameter fe_beam2n
Definition: element.f90:88
real(kind=kreal) function getreferencelength(fetype, nn, localcoord, elecoord)
This function calculates reference length at a point in surface.
Definition: element.f90:1412
integer, parameter fe_line3n
Definition: element.f90:69
subroutine curvature(fetype, nn, localcoord, elecoord, l2ndderiv, normal, curv)
Calculate curvature tensor at a point along 3d surface.
Definition: element.f90:1113
integer, parameter fe_edgesmooth_tet4n
Definition: element.f90:103
integer, parameter fe_tet10n
Definition: element.f90:78
integer, parameter fe_tri6n_shell
Definition: element.f90:92
subroutine gauss2node(fetype, gaussv, nodev)
This subroutine extroplate value in quadrature point to element nodes.
Definition: element.f90:1357
subroutine interapolatevalue(lpos, fetype, nnode, pvalue, ndvalue)
This subroutine interapolate element nodes value into a point value.
Definition: element.f90:1340
real(kind=kreal) function getshellthicknessweight(etype, np)
Fetch the through-thickness quadrature weight of a shell element.
Definition: element.f90:522
integer, parameter fe_quad4n_patch
Definition: element.f90:107
integer, parameter fe_beam3n
Definition: element.f90:89
integer, parameter fe_quad8n
Definition: element.f90:74
integer, parameter fe_tet4n
Definition: element.f90:76
subroutine getintpoint4ss(fetype, np, pos, n_intp, shapefunc)
Definition: element.f90:624
This module provides aux functions.
Definition: utilities.f90:6
subroutine cross_product(v1, v2, vn)
Definition: utilities.f90:406
This module contains Gauss point information.
Definition: quadrature.f90:30
real(kind=kreal), dimension(3, 9) gauss3d8
Definition: quadrature.f90:34
real(kind=kreal), dimension(2, 1) gauss2d4
Definition: quadrature.f90:34
real(kind=kreal), dimension(3, 4) gauss3d5
Definition: quadrature.f90:34
real(kind=kreal), dimension(2, 16) gauss2d16
Definition: quadrature.f90:34
real(kind=kreal), dimension(1) weight2d4
Definition: quadrature.f90:34
real(kind=kreal), dimension(3, 8) gauss3d2
Definition: quadrature.f90:34
real(kind=kreal), dimension(3, 2) gauss3d7
Definition: quadrature.f90:34
real(kind=kreal), dimension(2, 9) gauss2d3
Definition: quadrature.f90:34
real(kind=kreal), dimension(2, 27) gauss2d27
Definition: quadrature.f90:34
real(kind=kreal), dimension(2, 4) gauss2d2
Definition: quadrature.f90:34
real(kind=kreal), dimension(9) weight3d8
Definition: quadrature.f90:34
real(kind=kreal), dimension(3, 1) gauss3d4
Definition: quadrature.f90:34
real(kind=kreal), dimension(2) weight1d2
Definition: quadrature.f90:34
real(kind=kreal), dimension(4) weight3d5
Definition: quadrature.f90:34
real(kind=kreal), dimension(2, 3) gauss2d5
Definition: quadrature.f90:34
real(kind=kreal), dimension(1, 2) gauss1d2
Definition: quadrature.f90:34
real(kind=kreal), dimension(2, 4) gauss2d6
Definition: quadrature.f90:34
real(kind=kreal), dimension(1, 3) gauss1d3
Definition: quadrature.f90:34
real(kind=kreal), dimension(27) weight3d3
Definition: quadrature.f90:34
real(kind=kreal), dimension(3, 27) gauss3d3
Definition: quadrature.f90:34
real(kind=kreal), dimension(16) weight2d16
Definition: quadrature.f90:34
real(kind=kreal), dimension(3) weight1d3
Definition: quadrature.f90:34
real(kind=kreal), dimension(27) weight2d27
Definition: quadrature.f90:34
real(kind=kreal), dimension(8) weight3d2
Definition: quadrature.f90:34
real(kind=kreal), dimension(9) weight2d3
Definition: quadrature.f90:34
real(kind=kreal), dimension(4) weight2d2
Definition: quadrature.f90:34
real(kind=kreal), dimension(2) weight3d7
Definition: quadrature.f90:34
real(kind=kreal), dimension(1) weight3d4
Definition: quadrature.f90:34
real(kind=kreal), dimension(3) weight2d5
Definition: quadrature.f90:34
real(kind=kreal), dimension(1) weight1d1
Definition: quadrature.f90:34
real(kind=kreal), dimension(1, 1) gauss1d1
Definition: quadrature.f90:34
This module contains functions for interpolation in 20 node hexahedral element (Serendipity interpola...
Definition: hex20n.f90:7
subroutine shapefunc_hex20n(localcoord, func)
Definition: hex20n.f90:12
subroutine shapederiv_hex20n(localcoord, func)
Definition: hex20n.f90:41
This module contains functions for interpolation in 8 node hexahedral element (Langrange interpolatio...
Definition: hex8n.f90:7
subroutine shapederiv_hex8n(localcoord, func)
Definition: hex8n.f90:25
subroutine shapefunc_hex8n(localcoord, func)
Definition: hex8n.f90:12
This module contains functions for interpolation in 2 node line element (Langrange interpolation)
Definition: line2n.f90:7
subroutine shapefunc_line2n(lcoord, func)
Definition: line2n.f90:12
subroutine shapederiv_line2n(func)
Definition: line2n.f90:19
This module contains functions for interpolation in 3 nodes line element (Langrange interpolation)
Definition: line3n.f90:7
subroutine shapefunc_line3n(lcoord, func)
Definition: line3n.f90:12
subroutine shapederiv_line3n(lcoord, func)
Definition: line3n.f90:20
This module contains functions for interpolation in 15 node prism element (Langrange interpolation)
Definition: prism15n.f90:7
subroutine shapefunc_prism15n(ncoord, shp)
Definition: prism15n.f90:13
subroutine shapederiv_prism15n(ncoord, func)
Definition: prism15n.f90:37
This module contains functions for interpolation in 6 node prism element (Langrange interpolation)
Definition: prism6n.f90:7
subroutine shapefunc_prism6n(ncoord, func)
Definition: prism6n.f90:12
subroutine shapederiv_prism6n(ncoord, func)
Definition: prism6n.f90:27
This module contains functions for interpolation in 4 node qudrilateral element (Langrange interpolat...
Definition: quad4n.f90:7
subroutine shapederiv_quad4n(lcoord, func)
Definition: quad4n.f90:21
subroutine shape2ndderiv_quad4n(func)
Definition: quad4n.f90:35
subroutine shapefunc_quad4n(lcoord, func)
Definition: quad4n.f90:12
subroutine nodalnaturalcoord_quad4n(nncoord)
Definition: quad4n.f90:53
This module contains functions for interpolation in 8 node quadrilateral element (Serendipity interpo...
Definition: quad8n.f90:7
subroutine shape2ndderiv_quad8n(lcoord, func)
Definition: quad8n.f90:56
subroutine shapederiv_quad8n(lcoord, func)
Definition: quad8n.f90:33
subroutine shapefunc_quad8n(lcoord, func)
Definition: quad8n.f90:14
This module contains functions for interpolation in 9 node quadrilateral element.
Definition: quad9n.f90:7
subroutine shapederiv_quad9n(lcoord, func)
Definition: quad9n.f90:91
subroutine shapefunc_quad9n(lcoord, func)
Definition: quad9n.f90:23
subroutine nodalnaturalcoord_quad9n(nncoord)
Definition: quad9n.f90:174
This module contains functions for interpolation in 10 node tetrahedron element (Langrange interpolat...
Definition: tet10n.f90:7
subroutine shapefunc_tet10n(volcoord, shp)
Definition: tet10n.f90:12
subroutine shapederiv_tet10n(volcoord, shp)
Definition: tet10n.f90:30
This module contains functions for interpolation in 4 node tetrahedron element (Langrange interpolati...
Definition: tet4n.f90:7
subroutine shapefunc_tet4n(volcoord, func)
Definition: tet4n.f90:12
subroutine shapederiv_tet4n(func)
Definition: tet4n.f90:19
This module contains functions for interpolation in 3 node trianglar element (Langrange interpolation...
Definition: tri3n.f90:7
subroutine shape2ndderiv_tri3n(func)
Definition: tri3n.f90:30
subroutine nodalnaturalcoord_tri3n(nncoord)
Definition: tri3n.f90:38
subroutine shapefunc_tri3n(areacoord, func)
Definition: tri3n.f90:12
subroutine shapederiv_tri3n(func)
Definition: tri3n.f90:19
This module contains functions for interpolation in 6 node trianglar element (Langrange interpolation...
Definition: tri6n.f90:7
subroutine shapefunc_tri6n(areacoord, func)
Definition: tri6n.f90:12
subroutine shape2ndderiv_tri6n(func)
Definition: tri6n.f90:48
subroutine shapederiv_tri6n(areacoord, func)
Definition: tri6n.f90:26