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  implicit none
59 
60  integer, parameter, private :: kreal = kind(0.0d0)
61 
62  !-------------------------------------------
63  ! Fllowing ID of element types
64  !-------------------------------------------
65  integer, parameter :: fe_unknown = -1
66 
67  integer, parameter :: fe_line2n = 111
68  integer, parameter :: fe_line3n = 112
69  integer, parameter :: fe_tri3n = 231
70  integer, parameter :: fe_tri6n = 232
71  integer, parameter :: fe_tri6nc = 2322
72  integer, parameter :: fe_quad4n = 241
73  integer, parameter :: fe_quad8n = 242
74  integer, parameter :: fe_truss = 301
75  integer, parameter :: fe_tet4n = 341
76  integer, parameter :: fe_tet4n_pipi = 3414
77  integer, parameter :: fe_tet10n = 342
78  integer, parameter :: fe_tet10nc = 3422
79  integer, parameter :: fe_prism6n = 351
80  integer, parameter :: fe_prism15n = 352
81  integer, parameter :: fe_hex8n = 361
82  integer, parameter :: fe_hex20n = 362
83  integer, parameter :: fe_hex27n = 363
84 
85  integer, parameter :: fe_if_line2n = 511
86 
87  integer, parameter :: fe_beam2n = 611
88  integer, parameter :: fe_beam3n = 612
89  integer, parameter :: fe_beam341 = 641
90 
91  integer, parameter :: fe_tri6n_shell = 732
92  integer, parameter :: fe_dsg3_shell = 733
93  integer, parameter :: fe_mitc3_shell = 731
94  integer, parameter :: fe_mitc4_shell = 741
95  integer, parameter :: fe_mitc8_shell = 742
96  integer, parameter :: fe_mitc9_shell = 743
97 
98  integer, parameter :: fe_mitc3_shell361 = 761
99  integer, parameter :: fe_mitc4_shell361 = 781
100 
101  integer, parameter :: fe_nodesmooth_tet4n = 881
102  integer, parameter :: fe_edgesmooth_tet4n = 891
103 
104  integer, parameter :: fe_tri3n_patch = 1031
105  integer, parameter :: fe_tri6n_patch = 1032
106  integer, parameter :: fe_quad4n_patch = 1041
107  integer, parameter :: fe_quad8n_patch = 1042
108  ! ---------------------------------------------
109 
110 contains
111 
112  !************************************
113  ! Following geometric information
114  !************************************
116  integer(kind=kind(2)) function getspacedimension( etype )
117  integer, intent(in) :: etype
118 
119  select case( etype)
124  case default
126  end select
127  end function
128 
130  integer(kind=kind(2)) function getnumberofnodes( etype )
131  integer, intent(in) :: etype
132 
133  select case (etype)
135  getnumberofnodes = 2
136  case (fe_line3n, fe_beam3n)
137  getnumberofnodes = 3
139  getnumberofnodes = 3
141  getnumberofnodes = 6
143  getnumberofnodes = 4
145  getnumberofnodes = 8
146  case ( fe_mitc9_shell )
147  getnumberofnodes = 9
149  getnumberofnodes = 4
150  case ( fe_tet10n, fe_tet10nc )
151  getnumberofnodes = 10
152  case ( fe_prism6n )
153  getnumberofnodes = 6
154  case ( fe_prism15n )
155  getnumberofnodes = 15
156  case ( fe_hex8n )
157  getnumberofnodes = 8
158  case ( fe_hex20n )
159  getnumberofnodes = 20
160  case default
161  getnumberofnodes = -1
162  ! error message
163  end select
164  end function
165 
167  integer(kind=kind(2)) function getnumberofsubface( etype )
168  integer, intent(in) :: etype
169 
170  select case (etype)
179  case ( fe_prism6n, fe_prism15n )
181  case ( fe_hex8n, fe_hex20n)
185  case default
186  getnumberofsubface = -1
187  ! error message
188  end select
189  end function
190 
192  subroutine getsubface( intype, innumber, outtype, nodes )
193  integer, intent(in) :: intype
194  integer, intent(in) :: innumber
195  integer, intent(out) :: outtype
196  integer, intent(out) :: nodes(:)
197 
198  if( innumber>getnumberofsubface( intype ) ) stop "Error in getting subface"
199  select case ( intype )
201  outtype = fe_tri3n
202  select case ( innumber )
203  case (1)
204  nodes(1)=1; nodes(2)=2; nodes(3)=3
205  case (2)
206  nodes(1)=4; nodes(2)=2; nodes(3)=1
207  case (3)
208  nodes(1)=4; nodes(2)=3; nodes(3)=2
209  case (4)
210  nodes(1)=4; nodes(2)=1; nodes(3)=3
211  end select
212  case (fe_tet10n)
213  outtype = fe_tri6n
214  select case ( innumber )
215  case (1)
216  nodes(1)=1; nodes(2)=2; nodes(3)=3
217  nodes(4)=5; nodes(5)=6; nodes(6)=7
218  case (2)
219  nodes(1)=4; nodes(2)=2; nodes(3)=1
220  nodes(4)=9; nodes(5)=5; nodes(6)=8
221  case (3)
222  nodes(1)=4; nodes(2)=3; nodes(3)=2
223  nodes(4)=10; nodes(5)=6; nodes(6)=9
224  case (4)
225  nodes(1)=4; nodes(2)=1; nodes(3)=3
226  nodes(4)=8; nodes(5)=7; nodes(6)=10
227  end select
228  case (fe_tet10nc)
229  outtype = fe_tri6nc
230  select case ( innumber )
231  case (1)
232  nodes(1)=1; nodes(2)=2; nodes(3)=3
233  nodes(4)=5; nodes(5)=6; nodes(6)=7
234  case (2)
235  nodes(1)=4; nodes(2)=2; nodes(3)=1
236  nodes(4)=9; nodes(5)=5; nodes(6)=8
237  case (3)
238  nodes(1)=4; nodes(2)=3; nodes(3)=2
239  nodes(4)=10; nodes(5)=6; nodes(6)=9
240  case (4)
241  nodes(1)=4; nodes(2)=1; nodes(3)=3
242  nodes(4)=8; nodes(5)=7; nodes(6)=10
243  end select
244  case ( fe_hex8n )
245  outtype = fe_quad4n
246  select case ( innumber )
247  case (1)
248  nodes(1)=1; nodes(2)=2; nodes(3)=3; nodes(4)=4
249  case (2)
250  nodes(1)=8; nodes(2)=7; nodes(3)=6; nodes(4)=5
251  case (3)
252  nodes(1)=5; nodes(2)=6; nodes(3)=2; nodes(4)=1
253  case (4)
254  nodes(1)=6; nodes(2)=7; nodes(3)=3; nodes(4)=2
255  case (5)
256  nodes(1)=7; nodes(2)=8; nodes(3)=4; nodes(4)=3
257  case (6)
258  nodes(1)=8; nodes(2)=5; nodes(3)=1; nodes(4)=4
259  case default
260  ! error
261  end select
262  case (fe_hex20n)
263  outtype = fe_quad8n
264  select case ( innumber )
265  case (1)
266  nodes(1)=1; nodes(2)=2; nodes(3)=3; nodes(4)=4
267  nodes(5)=9; nodes(6)=10; nodes(7)=11; nodes(8)=12
268  case (2)
269  nodes(1)=8; nodes(2)=7; nodes(3)=6; nodes(4)=5
270  nodes(5)=15; nodes(6)=14; nodes(7)=13; nodes(8)=16
271  case (3)
272  nodes(1)=5; nodes(2)=6; nodes(3)=2; nodes(4)=1
273  nodes(5)=13; nodes(6)=18; nodes(7)=9; nodes(8)=17
274  case (4)
275  nodes(1)=6; nodes(2)=7; nodes(3)=3; nodes(4)=2
276  nodes(5)=14; nodes(6)=19; nodes(7)=10; nodes(8)=18
277  case (5)
278  nodes(1)=7; nodes(2)=8; nodes(3)=4; nodes(4)=3
279  nodes(5)=15; nodes(6)=20; nodes(7)=11; nodes(8)=19
280  case (6)
281  nodes(1)=8; nodes(2)=5; nodes(3)=1; nodes(4)=4
282  nodes(5)=16; nodes(6)=17; nodes(7)=12; nodes(8)=20
283  case default
284  ! error
285  end select
286  case (fe_prism6n)
287  select case ( innumber )
288  case (1)
289  outtype = fe_tri3n
290  nodes(1)=1; nodes(2)=2; nodes(3)=3
291  case (2)
292  outtype = fe_tri3n
293  nodes(1)=6; nodes(2)=5; nodes(3)=4
294  case (3)
295  outtype = fe_quad4n
296  nodes(1)=4; nodes(2)=5; nodes(3)=2; nodes(4)=1
297  case (4)
298  outtype = fe_quad4n
299  nodes(1)=5; nodes(2)=6; nodes(3)=3; nodes(4)=2
300  case (5)
301  outtype = fe_quad4n
302  nodes(1)=6; nodes(2)=4; nodes(3)=1; nodes(4)=3
303  end select
304  case (fe_prism15n)
305  select case ( innumber )
306  case (1)
307  outtype = fe_tri6n
308  nodes(1)=1; nodes(2)=2; nodes(3)=3
309  nodes(4)=7; nodes(5)=8; nodes(6)=9
310  case (2)
311  outtype = fe_tri6n
312  nodes(1)=6; nodes(2)=5; nodes(3)=4
313  nodes(4)=11; nodes(5)=10; nodes(6)=12
314  case (3)
315  outtype = fe_quad8n
316  nodes(1)=4; nodes(2)=5; nodes(3)=2; nodes(4)=1
317  nodes(5)=10; nodes(6)=14; nodes(7)=7; nodes(8)=13
318  case (4)
319  outtype = fe_quad8n
320  nodes(1)=5; nodes(2)=6; nodes(3)=3; nodes(4)=2
321  nodes(5)=11; nodes(6)=15; nodes(7)=8; nodes(8)=14
322  case (5)
323  outtype = fe_quad8n
324  nodes(1)=6; nodes(2)=4; nodes(3)=1; nodes(4)=3
325  nodes(5)=12; nodes(6)=13; nodes(7)=9; nodes(8)=15
326  end select
327  case ( fe_tri3n, fe_mitc3_shell )
328  outtype = fe_line2n
329  select case (innumber )
330  case (1)
331  nodes(1) = 1; nodes(2)=2
332  case (2)
333  nodes(1) = 2; nodes(2)=3
334  case (3)
335  nodes(1) = 3; nodes(2)=1
336  end select
338  outtype = fe_line3n
339  select case (innumber )
340  case (1)
341  nodes(1) = 1; nodes(2)=2; nodes(3)=4
342  case (2)
343  nodes(1) = 2; nodes(2)=3; nodes(3)=5
344  case (3)
345  nodes(1) = 3; nodes(2)=1; nodes(3)=6
346  end select
347  case ( fe_quad4n, fe_mitc4_shell )
348  outtype = fe_line2n
349  select case (innumber )
350  case (1)
351  nodes(1) = 1; nodes(2)=2
352  case (2)
353  nodes(1) = 2; nodes(2)=3
354  case (3)
355  nodes(1) = 3; nodes(2)=4
356  case (4)
357  nodes(1) = 4; nodes(2)=1
358  end select
360  outtype = fe_line3n
361  select case (innumber )
362  case (1)
363  nodes(1) = 1; nodes(2)=2; nodes(3)=5
364  case (2)
365  nodes(1) = 2; nodes(2)=3; nodes(3)=6
366  case (3)
367  nodes(1) = 3; nodes(2)=4; nodes(3)=7
368  case (4)
369  nodes(1) = 4; nodes(2)=1; nodes(3)=8
370  end select
371  case (fe_mitc3_shell361)
372  select case ( innumber )
373  case (1)
374  outtype = fe_tri3n
375  nodes(1)=1; nodes(2)=2; nodes(3)=3
376  case (2)
377  outtype = fe_tri3n
378  nodes(1)=6; nodes(2)=5; nodes(3)=4
379  case (3)
380  outtype = fe_quad4n
381  nodes(1)=4; nodes(2)=5; nodes(3)=2; nodes(4)=1
382  case (4)
383  outtype = fe_quad4n
384  nodes(1)=5; nodes(2)=6; nodes(3)=3; nodes(4)=2
385  case (5)
386  outtype = fe_quad4n
387  nodes(1)=6; nodes(2)=4; nodes(3)=1; nodes(4)=3
388  end select
389  case ( fe_mitc4_shell361 )
390  outtype = fe_quad4n
391  select case ( innumber )
392  case (1)
393  nodes(1)=1; nodes(2)=2; nodes(3)=3; nodes(4)=4
394  case (2)
395  nodes(1)=8; nodes(2)=7; nodes(3)=6; nodes(4)=5
396  case (3)
397  nodes(1)=5; nodes(2)=6; nodes(3)=2; nodes(4)=1
398  case (4)
399  nodes(1)=6; nodes(2)=7; nodes(3)=3; nodes(4)=2
400  case (5)
401  nodes(1)=7; nodes(2)=8; nodes(3)=4; nodes(4)=3
402  case (6)
403  nodes(1)=8; nodes(2)=5; nodes(3)=1; nodes(4)=4
404  case default
405  ! error
406  end select
407  case ( fe_tri3n_patch )
408  outtype = fe_tri3n
409  select case ( innumber )
410  case (1)
411  nodes(1)=1; nodes(2)=2; nodes(3)=3
412  case default
413  !error
414  end select
415  case ( fe_tri6n_patch )
416  outtype = fe_tri6n
417  select case ( innumber )
418  case (1)
419  nodes(1)=1; nodes(2)=2; nodes(3)=3
420  nodes(4)=4; nodes(5)=5; nodes(6)=6
421  case default
422  !error
423  end select
424  case ( fe_quad4n_patch )
425  outtype = fe_quad4n
426  select case ( innumber )
427  case (1)
428  nodes(1)=1; nodes(2)=2; nodes(3)=3; nodes(4)=4
429  case default
430  !error
431  end select
432  case ( fe_quad8n_patch )
433  outtype = fe_quad8n
434  select case ( innumber )
435  case (1)
436  nodes(1)=1; nodes(2)=2; nodes(3)=3; nodes(4)=4
437  nodes(5)=5; nodes(6)=6; nodes(7)=7; nodes(8)=8
438  case default
439  !error
440  end select
441  case default
442  outtype = fe_unknown
443  stop "element type not defined-sbs"
444  ! error message
445  end select
446  end subroutine
447 
449  integer function numofquadpoints( fetype )
450  integer, intent(in) :: fetype
451  select case (fetype)
453  numofquadpoints = 1
454  case ( fe_tri6n )
455  numofquadpoints = 3
456  case ( fe_tri6nc )
457  numofquadpoints = 4
458  case (fe_line3n )
459  numofquadpoints = 2
461  numofquadpoints = 4
462  case ( fe_quad8n, fe_mitc9_shell )
463  numofquadpoints = 9
464  case ( fe_hex8n )
465  numofquadpoints = 8
466  case ( fe_hex20n, fe_mitc8_shell )
467  numofquadpoints = 27
468  case ( fe_prism6n )
469  numofquadpoints = 2
471  numofquadpoints = 3
472  case ( fe_prism15n, fe_tri6n_shell )
473  numofquadpoints = 9
474  case ( fe_tet10n, fe_tet4n_pipi )
475  numofquadpoints = 4
476  case ( fe_tet10nc )
477  numofquadpoints = 12
479  numofquadpoints = 1
480  case default
481  numofquadpoints = -1
482  ! error message
483  stop "element type not defined-np"
484  end select
485  end function
486 
488  integer function numofshellthicknessquadpoints( etype )
489  integer, intent(in) :: etype
490 
491  select case (etype)
494  case (fe_mitc9_shell)
496  case default
498  end select
499  end function numofshellthicknessquadpoints
500 
502  subroutine getshellthicknessquadpoint( etype, np, zeta )
503  use quadrature, only: gauss1d2, gauss1d3
504  integer, intent(in) :: etype, np
505  real(kind=kreal), intent(out) :: zeta
506 
507  if (np < 1 .or. np > numofshellthicknessquadpoints(etype)) then
508  stop "invalid shell thickness quadrature point"
509  endif
510 
511  select case (etype)
513  zeta = gauss1d2(1, np)
514  case (fe_mitc9_shell)
515  zeta = gauss1d3(1, np)
516  end select
517  end subroutine getshellthicknessquadpoint
518 
520  real(kind=kreal) function getshellthicknessweight( etype, np )
521  use quadrature, only: weight1d2, weight1d3
522  integer, intent(in) :: etype, np
523 
524  if (np < 1 .or. np > numofshellthicknessquadpoints(etype)) then
525  stop "invalid shell thickness quadrature point"
526  endif
527 
528  select case (etype)
531  case (fe_mitc9_shell)
533  end select
534  end function getshellthicknessweight
535 
537  subroutine getquadpoint( fetype, np, pos )
538  use quadrature
539  integer, intent(in) :: fetype
540  integer, intent(in) :: np
541  real(kind=kreal), intent(out) :: pos(:)
542 
543  if( np<1 .or. np>numofquadpoints(fetype) ) then
544  ! error
545  endif
546 
547  select case (fetype)
548  case (fe_tri3n)
549  pos(1:2)=gauss2d4(:,np)
550  case ( fe_tri6n, fe_mitc3_shell )
551  pos(1:2)=gauss2d5(:,np)
552  case (fe_tri6nc )
553  pos(1:2)=gauss2d6(:,np)
554  case ( fe_quad4n, fe_mitc4_shell )
555  pos(1:2)=gauss2d2(:,np)
556  case ( fe_quad8n, fe_mitc9_shell )
557  pos(1:2)=gauss2d3(:,np)
558  case ( fe_hex8n, fe_mitc4_shell361 )
559  pos(1:3)=gauss3d2(:,np)
560  case ( fe_hex20n, fe_mitc8_shell )
561  pos(1:3)=gauss3d3(:,np)
562  case ( fe_prism6n, fe_mitc3_shell361 )
563  pos(1:3)=gauss3d7(:,np)
564  case ( fe_prism15n, fe_tri6n_shell )
565  pos(1:3)=gauss3d8(:,np)
566  case ( fe_tet4n, fe_beam341 )
567  pos(1:3)=gauss3d4(:,np)
568  case ( fe_tet10n, fe_tet4n_pipi )
569  pos(1:3)=gauss3d5(:,np)
570  case ( fe_tet10nc )
571  pos(1:3)=np
572  case ( fe_line2n, fe_if_line2n )
573  pos(1:1)=gauss1d1(:,np)
574  case ( fe_line3n )
575  pos(1:1)=gauss1d2(:,np)
576  case default
577  ! error message
578  stop "element type not defined-qp"
579  end select
580  end subroutine
581 
583  real(kind=kreal) function getweight( fetype, np )
584  use quadrature
585  integer, intent(in) :: fetype
586  integer, intent(in) :: np
587  if( np<1 .or. np>numofquadpoints(fetype) ) then
588  ! error
589  endif
590 
591  select case (fetype)
592  case (fe_tri3n)
593  getweight = weight2d4(1)
594  case ( fe_tri6n, fe_mitc3_shell )
595  getweight = weight2d5(np)
596  case ( fe_quad4n, fe_mitc4_shell )
597  getweight = weight2d2(np)
598  case ( fe_quad8n, fe_mitc9_shell )
599  getweight = weight2d3(np)
600  case ( fe_hex8n, fe_mitc4_shell361 )
601  getweight = weight3d2(np)
602  case ( fe_hex20n)
603  getweight = weight3d3(np)
604  case ( fe_prism6n, fe_mitc3_shell361 )
605  getweight = weight3d7(np)
606  case ( fe_prism15n )
607  getweight = weight3d8(np)
608  case ( fe_tet4n, fe_beam341 )
609  getweight = weight3d4(1)
610  case ( fe_tet10n, fe_tet4n_pipi )
611  getweight = weight3d5(np)
612  case ( fe_line2n, fe_if_line2n )
613  getweight = weight1d1(1)
614  case ( fe_line3n )
615  getweight = weight1d2(np)
616  case default
617  getweight = 0.d0
618  ! error message
619  end select
620  end function
621 
622  !************************************
623  ! Following shape function information
624  !************************************
626  subroutine getshapederiv( fetype, localcoord, shapederiv )
627  integer, intent(in) :: fetype
628  real(kind=kreal), intent(in) :: localcoord(:)
629  real(kind=kreal), intent(out) :: shapederiv(:,:)
630 
631  select case (fetype)
632  case ( fe_tri3n, fe_mitc3_shell )
633  !error check
634  call shapederiv_tri3n(shapederiv(1:3,1:2))
635  case (fe_tri6n)
636  !error check
637  call shapederiv_tri6n(localcoord,shapederiv(1:6,1:2) )
638  case ( fe_quad4n, fe_mitc4_shell )
639  !error check
640  call shapederiv_quad4n(localcoord,shapederiv(1:4,1:2))
641  case (fe_quad8n)
642  !error check
643  call shapederiv_quad8n(localcoord,shapederiv(1:8,1:2))
644  case ( fe_mitc9_shell )
645  !error check
646  call shapederiv_quad9n(localcoord,shapederiv(1:9,1:2))
648  ! error check
649  call shapederiv_hex8n(localcoord,shapederiv(1:8,1:3))
650  case (fe_hex20n)
651  ! error check
652  call shapederiv_hex20n(localcoord, shapederiv(1:20,1:3))
654  call shapederiv_prism6n(localcoord,shapederiv(1:6,1:3))
655  case (fe_prism15n)
656  call shapederiv_prism15n(localcoord,shapederiv(1:15,1:3))
658  ! error check
659  call shapederiv_tet4n(shapederiv(1:4,1:3))
660  case (fe_tet10n)
661  ! error check
662  call shapederiv_tet10n(localcoord,shapederiv(1:10,1:3))
663  case default
664  ! error message
665  stop "Element type not defined-sde"
666  end select
667  end subroutine
668 
670  subroutine getshape2ndderiv( fetype, localcoord, shapederiv )
671  integer, intent(in) :: fetype
672  real(kind=kreal), intent(in) :: localcoord(:)
673  real(kind=kreal), intent(out) :: shapederiv(:,:,:)
674 
675  select case (fetype)
676  case ( fe_tri3n, fe_mitc3_shell )
677  !error check
678  call shape2ndderiv_tri3n(shapederiv(1:3,1:2,1:2))
679  case (fe_tri6n)
680  !error check
681  call shape2ndderiv_tri6n(shapederiv(1:6,1:2,1:2))
682  case ( fe_quad4n, fe_mitc4_shell )
683  !error check
684  call shape2ndderiv_quad4n(shapederiv(1:4,1:2,1:2))
685  case (fe_quad8n)
686  !error check
687  call shape2ndderiv_quad8n(localcoord,shapederiv(1:8,1:2,1:2))
688  case default
689  ! error message
690  stop "Cannot calculate second derivatives of shape function"
691  end select
692  end subroutine
693 
695  subroutine getshapefunc( fetype, localcoord, func )
696  integer, intent(in) :: fetype
697  real(kind=kreal), intent(in) :: localcoord(:)
698  real(kind=kreal), intent(out) :: func(:)
699 
700  select case (fetype)
701  case ( fe_tri3n, fe_mitc3_shell )
702  !error check
703  call shapefunc_tri3n(localcoord,func(1:3))
704  case (fe_tri6n)
705  !error check
706  call shapefunc_tri6n(localcoord,func(1:6))
707  case ( fe_quad4n, fe_mitc4_shell )
708  !error check
709  call shapefunc_quad4n(localcoord,func(1:4))
710  case (fe_quad8n)
711  !error check
712  call shapefunc_quad8n(localcoord,func(1:8))
714  ! error check
715  call shapefunc_hex8n(localcoord,func(1:8))
716  case ( fe_mitc9_shell )
717  !error check
718  call shapefunc_quad9n(localcoord,func(1:9))
719  case (fe_hex20n)
720  ! error check
721  call shapefunc_hex20n(localcoord,func(1:20))
723  call shapefunc_prism6n(localcoord,func(1:6))
724  case (fe_prism15n)
725  call shapefunc_prism15n(localcoord,func(1:15))
727  ! error check
728  call shapefunc_tet4n(localcoord,func(1:4))
729  case (fe_tet10n)
730  ! error check
731  call shapefunc_tet10n(localcoord,func(1:10))
732  case (fe_line2n, fe_if_line2n)
733  !error check
734  call shapefunc_line2n(localcoord,func(1:2))
735  case (fe_line3n)
736  !error check
737  call shapefunc_line3n(localcoord,func(1:3))
738  case default
739  stop "Element type not defined-sf"
740  ! error message
741  end select
742  end subroutine
743 
744 
745  ! (Gaku Hashimoto, The University of Tokyo, 2012/11/15) <
746  !####################################################################
747  subroutine getnodalnaturalcoord(fetype, nncoord)
748  !####################################################################
749 
750  integer, intent(in) :: fetype
751  real(kind = kreal), intent(out) :: nncoord(:, :)
752 
753  !--------------------------------------------------------------------
754 
755  select case( fetype )
757 
758  !error check
759  call nodalnaturalcoord_tri3n( nncoord(1:3, 1:2) )
760 
762 
763  !error check
764  call nodalnaturalcoord_quad4n( nncoord(1:4, 1:2) )
765 
766  case( fe_mitc9_shell )
767 
768  !error check
769  call nodalnaturalcoord_quad9n( nncoord(1:9, 1:2) )
770 
771  case default
772 
773  ! error message
774  stop "Element type not defined-sde"
775 
776  end select
777 
778  !--------------------------------------------------------------------
779 
780  return
781 
782  !####################################################################
783  end subroutine getnodalnaturalcoord
784  !####################################################################
785  ! > (Gaku Hashimoto, The University of Tokyo, 2012/11/15)
786 
787 
789  subroutine getglobalderiv( fetype, nn, localcoord, elecoord, det, gderiv )
790  integer, intent(in) :: fetype
791  integer, intent(in) :: nn
792  real(kind=kreal), intent(in) :: localcoord(:)
793  real(kind=kreal), intent(in) :: elecoord(:,:)
794  real(kind=kreal), intent(out) :: det
795  real(kind=kreal), intent(out) :: gderiv(:,:)
796 
797  real(kind=kreal) :: dum, xj(3,3), xji(3,3), deriv(nn,3)
798  integer :: nspace
799 
800  nspace = getspacedimension( fetype )
801  call getshapederiv( fetype, localcoord(:), deriv(1:nn,:) )
802 
803  if( nspace==2 ) then
804  xj(1:2,1:2)=matmul( elecoord(1:2,1:nn), deriv(1:nn,1:2) )
805  det=xj(1,1)*xj(2,2)-xj(2,1)*xj(1,2)
806  if( det==0.d0 ) stop "Math error in GetGlobalDeriv! Determinant==0.0"
807  dum=1.d0/det
808  xji(1,1)= xj(2,2)*dum
809  xji(1,2)=-xj(1,2)*dum
810  xji(2,1)=-xj(2,1)*dum
811  xji(2,2)= xj(1,1)*dum
812  else
813  ! JACOBI MATRIX
814  xj(1:3,1:3)= matmul( elecoord(1:3,1:nn), deriv(1:nn,1:3) )
815  !DETERMINANT OF JACOBIAN
816  det=xj(1,1)*xj(2,2)*xj(3,3) &
817  +xj(2,1)*xj(3,2)*xj(1,3) &
818  +xj(3,1)*xj(1,2)*xj(2,3) &
819  -xj(3,1)*xj(2,2)*xj(1,3) &
820  -xj(2,1)*xj(1,2)*xj(3,3) &
821  -xj(1,1)*xj(3,2)*xj(2,3)
822  if( det==0.d0 ) stop "Math error in GetGlobalDeriv! Determinant==0.0"
823  ! INVERSION OF JACOBIAN
824  dum=1.d0/det
825  xji(1,1)=dum*( xj(2,2)*xj(3,3)-xj(3,2)*xj(2,3) )
826  xji(1,2)=dum*(-xj(1,2)*xj(3,3)+xj(3,2)*xj(1,3) )
827  xji(1,3)=dum*( xj(1,2)*xj(2,3)-xj(2,2)*xj(1,3) )
828  xji(2,1)=dum*(-xj(2,1)*xj(3,3)+xj(3,1)*xj(2,3) )
829  xji(2,2)=dum*( xj(1,1)*xj(3,3)-xj(3,1)*xj(1,3) )
830  xji(2,3)=dum*(-xj(1,1)*xj(2,3)+xj(2,1)*xj(1,3) )
831  xji(3,1)=dum*( xj(2,1)*xj(3,2)-xj(3,1)*xj(2,2) )
832  xji(3,2)=dum*(-xj(1,1)*xj(3,2)+xj(3,1)*xj(1,2) )
833  xji(3,3)=dum*( xj(1,1)*xj(2,2)-xj(2,1)*xj(1,2) )
834  endif
835 
836  gderiv(1:nn,1:nspace)=matmul( deriv(1:nn,1:nspace), xji(1:nspace,1:nspace) )
837  end subroutine
838 
840  real(kind=kreal) function getdeterminant( fetype, nn, localcoord, elecoord )
841  integer, intent(in) :: fetype
842  integer, intent(in) :: nn
843  real(kind=kreal), intent(in) :: localcoord(:)
844  real(kind=kreal), intent(in) :: elecoord(:,:)
845 
846  real(kind=kreal) :: xj(3,3), deriv(nn,3)
847  integer :: nspace
848 
849  nspace = getspacedimension( fetype )
850  call getshapederiv( fetype, localcoord(:), deriv(1:nn,:) )
851 
852  if( nspace==2 ) then
853  xj(1:2,1:2)=matmul( elecoord(1:2,1:nn), deriv(1:nn,1:2) )
854  getdeterminant=xj(1,1)*xj(2,2)-xj(2,1)*xj(1,2)
855  else
856  xj(1:3,1:3)= matmul( elecoord(1:3,1:nn), deriv(1:nn,1:3) )
857  getdeterminant=xj(1,1)*xj(2,2)*xj(3,3) &
858  +xj(2,1)*xj(3,2)*xj(1,3) &
859  +xj(3,1)*xj(1,2)*xj(2,3) &
860  -xj(3,1)*xj(2,2)*xj(1,3) &
861  -xj(2,1)*xj(1,2)*xj(3,3) &
862  -xj(1,1)*xj(3,2)*xj(2,3)
863  endif
864 
865  end function
866 
868  subroutine getjacobian( fetype, nn, localcoord, elecoord, det, jacobian, inverse )
869  integer, intent(in) :: fetype
870  integer, intent(in) :: nn
871  real(kind=kreal), intent(in) :: localcoord(:)
872  real(kind=kreal), intent(in) :: elecoord(:,:)
873  real(kind=kreal), intent(out) :: det
874  real(kind=kreal), intent(out) :: jacobian(:,:)
875  real(kind=kreal), intent(out) :: inverse(:,:)
876 
877  real(kind=kreal) :: dum, deriv(nn,3)
878  integer :: nspace
879 
880  nspace = getspacedimension( fetype )
881  call getshapederiv( fetype, localcoord(:), deriv(1:nn,:) )
882 
883  if( nspace==2 ) then
884  jacobian(1:2,1:2)=matmul( elecoord(1:2,1:nn), deriv(1:nn,1:2) )
885  det=jacobian(1,1)*jacobian(2,2)-jacobian(2,1)*jacobian(1,2)
886  if( det==0.d0 ) stop "Math error in getJacobain! Determinant==0.0"
887  dum=1.0/det
888  inverse(1,1)= jacobian(2,2)*dum
889  inverse(1,2)=-jacobian(1,2)*dum
890  inverse(2,1)=-jacobian(2,1)*dum
891  inverse(2,2)= jacobian(1,1)*dum
892  else
893  ! JACOBI MATRIX
894  jacobian(1:3,1:3)= matmul( elecoord(1:3,1:nn), deriv(1:nn,1:3) )
895  !DETERMINANT OF JACOBIAN
896  det=jacobian(1,1)*jacobian(2,2)*jacobian(3,3) &
897  +jacobian(2,1)*jacobian(3,2)*jacobian(1,3) &
898  +jacobian(3,1)*jacobian(1,2)*jacobian(2,3) &
899  -jacobian(3,1)*jacobian(2,2)*jacobian(1,3) &
900  -jacobian(2,1)*jacobian(1,2)*jacobian(3,3) &
901  -jacobian(1,1)*jacobian(3,2)*jacobian(2,3)
902  if( det==0.d0 ) stop "Math error in getJacobain! Determinant==0.0"
903  ! INVERSION OF JACOBIAN
904  dum=1.d0/det
905  inverse(1,1)=dum*( jacobian(2,2)*jacobian(3,3)-jacobian(3,2)*jacobian(2,3) )
906  inverse(1,2)=dum*(-jacobian(1,2)*jacobian(3,3)+jacobian(3,2)*jacobian(1,3) )
907  inverse(1,3)=dum*( jacobian(1,2)*jacobian(2,3)-jacobian(2,2)*jacobian(1,3) )
908  inverse(2,1)=dum*(-jacobian(2,1)*jacobian(3,3)+jacobian(3,1)*jacobian(2,3) )
909  inverse(2,2)=dum*( jacobian(1,1)*jacobian(3,3)-jacobian(3,1)*jacobian(1,3) )
910  inverse(2,3)=dum*(-jacobian(1,1)*jacobian(2,3)+jacobian(2,1)*jacobian(1,3) )
911  inverse(3,1)=dum*( jacobian(2,1)*jacobian(3,2)-jacobian(3,1)*jacobian(2,2) )
912  inverse(3,2)=dum*(-jacobian(1,1)*jacobian(3,2)+jacobian(3,1)*jacobian(1,2) )
913  inverse(3,3)=dum*( jacobian(1,1)*jacobian(2,2)-jacobian(2,1)*jacobian(1,2) )
914  endif
915  end subroutine
916 
918  function surfacenormal( fetype, nn, localcoord, elecoord ) result( normal )
919  integer, intent(in) :: fetype
920  integer, intent(in) :: nn
921  real(kind=kreal), intent(in) :: localcoord(2)
922  real(kind=kreal), intent(in) :: elecoord(3,nn)
923  real(kind=kreal) :: normal(3)
924  real(kind=kreal) :: deriv(nn,2), gderiv(3,2)
925 
926  select case (fetype)
927  case (fe_tri3n)
928  !error check
929  call shapederiv_tri3n(deriv(1:3,1:2))
930  case (fe_tri6n)
931  !error check
932  call shapederiv_tri6n(localcoord,deriv(1:6,1:2))
933  case (fe_quad4n)
934  !error check
935  call shapederiv_quad4n(localcoord,deriv(1:4,1:2))
936  case (fe_quad8n)
937  !error check
938  call shapederiv_quad8n(localcoord,deriv(1:8,1:2))
939  case default
940  ! error message
941  normal =0.d0
942  return
943  end select
944 
945  gderiv = matmul( elecoord, deriv )
946  normal(1) = gderiv(2,1)*gderiv(3,2) - gderiv(3,1)*gderiv(2,2)
947  normal(2) = gderiv(3,1)*gderiv(1,2) - gderiv(1,1)*gderiv(3,2)
948  normal(3) = gderiv(1,1)*gderiv(2,2) - gderiv(2,1)*gderiv(1,2)
949  ! normal = normal/dsqrt(dot_product(normal, normal))
950  end function
951 
953  function edgenormal( fetype, nn, localcoord, elecoord ) result( normal )
954  integer, intent(in) :: fetype
955  integer, intent(in) :: nn
956  real(kind=kreal), intent(in) :: localcoord(1)
957  real(kind=kreal), intent(in) :: elecoord(2,nn)
958  real(kind=kreal) :: normal(2)
959  real(kind=kreal) :: deriv(nn,1), gderiv(2,1)
960 
961  select case (fetype)
962  case (fe_line2n, fe_if_line2n)
963  !error check
964  call shapederiv_line2n(deriv(1:nn,:))
965  case (fe_line3n)
966  !error check
967  call shapederiv_line3n(localcoord,deriv(1:nn,:))
968  case default
969  ! error message
970  normal =0.d0
971  return
972  end select
973 
974  gderiv = matmul( elecoord, deriv )
975  normal(1) = -gderiv(2,1)
976  normal(2) = gderiv(1,1)
977  ! normal = normal/dsqrt(dot_product(normal, normal))
978  end function
979 
981  subroutine tangentbase( fetype, nn, localcoord, elecoord, tangent )
982  integer, intent(in) :: fetype
983  integer, intent(in) :: nn
984  real(kind=kreal), intent(in) :: localcoord(2)
985  real(kind=kreal), intent(in) :: elecoord(3,nn)
986  real(kind=kreal), intent(out) :: tangent(3,2)
987  real(kind=kreal) :: deriv(nn,2)
988 
989  select case (fetype)
990  case (fe_tri3n)
991  !error check
992  call shapederiv_tri3n(deriv(1:3,1:2))
993  case (fe_tri6n)
994  !error check
995  call shapederiv_tri6n(localcoord,deriv(1:6,1:2))
996  case (fe_tri6nc)
997  !error check
998  call shapederiv_tri6n(localcoord,deriv(1:6,1:2))
999  case (fe_quad4n)
1000  !error check
1001  call shapederiv_quad4n(localcoord,deriv(1:4,1:2))
1002  case (fe_quad8n)
1003  !error check
1004  call shapederiv_quad8n(localcoord,deriv(1:8,1:2))
1005  case default
1006  ! error message
1007  tangent =0.d0
1008  return
1009  end select
1010 
1011  tangent = matmul( elecoord, deriv )
1012  end subroutine tangentbase
1013 
1015  subroutine curvature( fetype, nn, localcoord, elecoord, l2ndderiv, normal, curv )
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), intent(out) :: l2ndderiv(3,2,2)
1021  real(kind=kreal), intent(in), optional :: normal(3)
1022  real(kind=kreal), intent(out), optional :: curv(2,2)
1023  real(kind=kreal) :: deriv2(nn,2,2)
1024 
1025  select case (fetype)
1026  case (fe_tri3n)
1027  !error check
1028  call shape2ndderiv_tri3n(deriv2(1:3,1:2,1:2))
1029  case (fe_tri6n)
1030  !error check
1031  call shape2ndderiv_tri6n(deriv2(1:6,1:2,1:2))
1032  case (fe_tri6nc)
1033  !error check
1034  call shape2ndderiv_tri6n(deriv2(1:6,1:2,1:2))
1035  ! deriv2=0.d0
1036  case (fe_quad4n)
1037  !error check
1038  call shape2ndderiv_quad4n(deriv2(1:4,1:2,1:2))
1039  case (fe_quad8n)
1040  !error check
1041  call shape2ndderiv_quad8n(localcoord,deriv2(1:8,1:2,1:2))
1042  case default
1043  ! error message
1044  stop "Cannot calculate second derivatives of shape function"
1045  end select
1046 
1047  l2ndderiv(1:3,1,1) = matmul( elecoord(1:3,1:nn), deriv2(1:nn,1,1) )
1048  l2ndderiv(1:3,1,2) = matmul( elecoord(1:3,1:nn), deriv2(1:nn,1,2) )
1049  l2ndderiv(1:3,2,1) = matmul( elecoord(1:3,1:nn), deriv2(1:nn,2,1) )
1050  l2ndderiv(1:3,2,2) = matmul( elecoord(1:3,1:nn), deriv2(1:nn,2,2) )
1051  if( present(curv) ) then
1052  curv(1,1) = dot_product( l2ndderiv(:,1,1), normal(:) )
1053  curv(1,2) = dot_product( l2ndderiv(:,1,2), normal(:) )
1054  curv(2,1) = dot_product( l2ndderiv(:,2,1), normal(:) )
1055  curv(2,2) = dot_product( l2ndderiv(:,2,2), normal(:) )
1056  endif
1057  end subroutine curvature
1058 
1060  subroutine getelementcenter( fetype, localcoord )
1061  integer, intent(in) :: fetype
1062  real(kind=kreal), intent(out) :: localcoord(:)
1063 
1064  select case (fetype)
1065  case (fe_tri3n, fe_tri6n, fe_tri6nc)
1066  localcoord(1:2) = 1.d0/3.d0
1067  case (fe_quad4n, fe_quad8n)
1068  localcoord(1:2) = 0.d0
1069  case (fe_tet4n, fe_tet10n, fe_tet10nc)
1070  localcoord(1:3) = 1.d0/4.d0
1071  case (fe_prism6n, fe_prism15n)
1072  localcoord(1) = 1.d0/3.d0
1073  localcoord(2) = 1.d0/3.d0
1074  localcoord(3) = 0.d0
1075  case (fe_hex8n, fe_hex20n, fe_hex27n)
1076  localcoord(1:3) = 0.d0
1077  case default
1078  localcoord(:) = 0.d0
1079  end select
1080  end subroutine getelementcenter
1081 
1084  integer function isinsideelement( fetype, localcoord, clearance )
1085  integer, intent(in) :: fetype
1086  real(kind=kreal), intent(inout) :: localcoord(2)
1087  real(kind=kreal), optional :: clearance
1088  real(kind=kreal) :: clr, coord3
1089 
1090  clr = 1.d-6
1091  if( present(clearance) ) clr = clearance
1092  if( dabs(localcoord(1))<clr ) localcoord(1)=0.d0
1093  if( dabs(localcoord(2))<clr ) localcoord(2)=0.d0
1094  if( dabs(dabs(localcoord(1))-1.d0)<clr ) &
1095  localcoord(1)=sign(1.d0,localcoord(1))
1096  if( dabs(dabs(localcoord(2))-1.d0)<clr ) &
1097  localcoord(2)=sign(1.d0,localcoord(2))
1098  isinsideelement = -1
1099  select case (fetype)
1100  case (fe_tri3n, fe_tri6n, fe_tri6nc)
1101  !error check
1102  coord3 = 1.d0-(localcoord(1)+localcoord(2))
1103  if( dabs(coord3)<clr ) coord3=0.d0
1104  if( localcoord(1)>=0.d0 .and. localcoord(1)<=1.d0 .and. &
1105  localcoord(2)>=0.d0 .and. localcoord(2)<=1.d0 .and. &
1106  coord3>=0.d0 .and. coord3<=1.d0 ) then
1107  isinsideelement = 0
1108  if( localcoord(1)==1.d0 ) then
1109  isinsideelement = 1
1110  elseif( localcoord(2)==1.d0 ) then
1111  isinsideelement = 2
1112  elseif( coord3==1.d0 ) then
1113  isinsideelement = 3
1114  elseif( coord3==0.d0 ) then
1115  isinsideelement = 12
1116  elseif( localcoord(1)==0.d0 ) then
1117  isinsideelement = 23
1118  elseif( localcoord(2)==0.d0 ) then
1119  isinsideelement = 31
1120  endif
1121  endif
1122  case (fe_quad4n, fe_quad8n)
1123  !error check
1124  if( all(dabs(localcoord)<=1.d0) ) then
1125  isinsideelement = 0
1126  if( localcoord(1)==-1.d0 .and. localcoord(2)==-1.d0 ) then
1127  isinsideelement = 1
1128  elseif( localcoord(1)==1.d0 .and. localcoord(2)==-1.d0 ) then
1129  isinsideelement = 2
1130  elseif( localcoord(1)==1.d0 .and. localcoord(2)==1.d0 ) then
1131  isinsideelement = 3
1132  elseif( localcoord(1)==-1.d0 .and. localcoord(2)==1.d0 ) then
1133  isinsideelement = 4
1134  elseif( localcoord(2)==-1.d0 ) then
1135  isinsideelement = 12
1136  elseif( localcoord(1)==1.d0 ) then
1137  isinsideelement = 23
1138  elseif( localcoord(2)==1.d0 ) then
1139  isinsideelement = 34
1140  elseif( localcoord(1)==-1.d0 ) then
1141  isinsideelement = 41
1142  endif
1143  endif
1144  end select
1145  end function isinsideelement
1146 
1149  integer function isinside3delement( fetype, localcoord, clearance )
1150  integer, intent(in) :: fetype
1151  real(kind=kreal), intent(inout) :: localcoord(3)
1152  real(kind=kreal), optional :: clearance
1153  real(kind=kreal) :: clr, coord4
1154 
1155  integer :: idof
1156 
1157  clr = 1.d-6
1158  if( present(clearance) ) clr = clearance
1159  do idof=1,3
1160  if( dabs(localcoord(idof))<clr ) localcoord(idof)=0.d0
1161  if( dabs(dabs(localcoord(idof))-1.d0)<clr ) &
1162  & localcoord(idof)=sign(1.d0,localcoord(idof))
1163  enddo
1164 
1165  isinside3delement = -1
1166  select case (fetype)
1168  !error check
1169  coord4 = 1.d0-(localcoord(1)+localcoord(2)+localcoord(3))
1170  if( dabs(coord4)<clr ) coord4=0.d0
1171  isinside3delement = 0
1172  do idof=1,3
1173  if( localcoord(idof) < 0.d0 .or. localcoord(idof) > 1.d0 ) isinside3delement = -1
1174  enddo
1175  if( coord4 < 0.d0 .or. coord4 > 1.d0 ) isinside3delement = -1
1176  case (fe_prism6n, fe_prism15n)
1177  !error check
1178  coord4 = 1.d0-(localcoord(1)+localcoord(2))
1179  isinside3delement = 0
1180  do idof=1,2
1181  if( localcoord(idof) < 0.d0 .or. localcoord(idof) > 1.d0 ) isinside3delement = -1
1182  enddo
1183  if( localcoord(3) < -1.d0 .or. localcoord(3) > 1.d0 ) isinside3delement = -1
1184  if( coord4 < 0.d0 .or. coord4 > 1.d0 ) isinside3delement = -1
1185  case (fe_hex8n, fe_hex20n, fe_hex27n)
1186  if( all(dabs(localcoord)<=1.d0) ) isinside3delement = 0
1187  end select
1188  end function
1189 
1191  subroutine getvertexcoord( fetype, cnode, localcoord )
1192  integer, intent(in) :: fetype
1193  integer, intent(in) :: cnode
1194  real(kind=kreal), intent(out) :: localcoord(2)
1195 
1196  select case (fetype)
1197  case (fe_tri3n, fe_tri6n, fe_tri6nc)
1198  if( cnode==1 ) then
1199  localcoord(1) =1.d0
1200  localcoord(2) =0.d0
1201  elseif( cnode==2 ) then
1202  localcoord(1) =0.d0
1203  localcoord(2) =1.d0
1204  else
1205  localcoord(1) =0.d0
1206  localcoord(2) =0.d0
1207  endif
1208  case (fe_quad4n, fe_quad8n)
1209  if( cnode==1 ) then
1210  localcoord(1) =-1.d0
1211  localcoord(2) =-1.d0
1212  elseif( cnode==2 ) then
1213  localcoord(1) =1.d0
1214  localcoord(2) =-1.d0
1215  elseif( cnode==3 ) then
1216  localcoord(1) =1.d0
1217  localcoord(2) =1.d0
1218  else
1219  localcoord(1) =-1.d0
1220  localcoord(2) =1.d0
1221  endif
1222  end select
1223  end subroutine
1224 
1226  subroutine extrapolatevalue( lpos, fetype, nnode, pvalue, ndvalue )
1227  real(kind=kreal), intent(in) :: lpos(:)
1228  integer, intent(in) :: fetype
1229  integer, intent(in) :: nnode
1230  real(kind=kreal), intent(in) :: pvalue(:)
1231  real(kind=kreal), intent(out) :: ndvalue(:,:)
1232 
1233  integer :: i
1234  real(kind=kreal) :: shapefunc(nnode)
1235  call getshapefunc( fetype, lpos, shapefunc )
1236  do i=1,nnode
1237  ndvalue(i,:) = shapefunc(i)*pvalue(:)
1238  enddo
1239  end subroutine
1240 
1242  subroutine interapolatevalue( lpos, fetype, nnode, pvalue, ndvalue )
1243  real(kind=kreal), intent(in) :: lpos(:)
1244  integer, intent(in) :: fetype
1245  integer, intent(in) :: nnode
1246  real(kind=kreal), intent(out) :: pvalue(:)
1247  real(kind=kreal), intent(in) :: ndvalue(:,:)
1248 
1249  integer :: i
1250  real(kind=kreal) :: shapefunc(nnode)
1251  call getshapefunc( fetype, lpos, shapefunc )
1252  pvalue(:) = 0
1253  do i=1,nnode
1254  pvalue(:) = pvalue(:)+ shapefunc(i)*ndvalue(i,:)
1255  enddo
1256  end subroutine
1257 
1259  subroutine gauss2node( fetype, gaussv, nodev )
1260  integer, intent(in) :: fetype
1261  real(kind=kreal), intent(in) :: gaussv(:,:)
1262  real(kind=kreal), intent(out) :: nodev(:,:)
1263 
1264  integer :: i, ngauss, nnode
1265  real(kind=kreal) :: localcoord(3), func(100)
1266  ngauss = numofquadpoints( fetype )
1267  nnode = getnumberofnodes( fetype )
1268  ! error checking
1269  select case (fetype)
1270  case (fe_tri3n)
1271  !error check
1272  do i=1,nnode
1273  nodev(i,:) = gaussv(1,:)
1274  enddo
1275  case (fe_tri6n)
1276  !error check
1277  ! func(1:6) = ShapeFunc_tri6n(localcoord)
1278  case (fe_quad4n)
1279  !error check
1280  ! nodev(:,:) = gaussv(1,:)
1281  case (fe_quad8n)
1282  !error check
1283  call shapefunc_quad8n(localcoord,func(1:8))
1284  case (fe_hex8n, fe_mitc4_shell361)
1285  ! error check
1286  call shapefunc_hex8n(localcoord,func(1:8))
1287  case (fe_hex20n)
1288  ! error check
1289  call shapefunc_hex20n(localcoord,func(1:20))
1291  do i=1,3
1292  nodev(i,:) = gaussv(1,:)
1293  enddo
1294  do i=1,3
1295  nodev(i+3,:) = gaussv(2,:)
1296  enddo
1297  case (fe_prism15n)
1298  call shapefunc_prism15n(localcoord,func(1:15))
1300  ! error check
1301  do i=1,nnode
1302  nodev(i,:) = gaussv(1,:)
1303  enddo
1304  case (fe_tet10n)
1305  ! error check
1306  call shapefunc_tet10n(localcoord,func(1:10))
1307  case default
1308  stop "Element type not defined"
1309  ! error message
1310  end select
1311  end subroutine
1312 
1314  real(kind=kreal) function getreferencelength( fetype, nn, localcoord, elecoord )
1315  integer, intent(in) :: fetype
1316  integer, intent(in) :: nn
1317  real(kind=kreal),intent(in) :: localcoord(2)
1318  real(kind=kreal),intent(in) :: elecoord(3,nn)
1319  real(kind=kreal) :: detjxy, detjyz, detjxz, detj
1320  detjxy = getdeterminant( fetype, nn, localcoord, elecoord(1:2,1:nn) )
1321  detjyz = getdeterminant( fetype, nn, localcoord, elecoord(2:3,1:nn) )
1322  detjxz = getdeterminant( fetype, nn, localcoord, elecoord(1:3:2,1:nn) )
1323  detj = dsqrt( detjxy **2 + detjyz **2 + detjxz **2 )
1324  getreferencelength = dsqrt( detj )
1325  end function getreferencelength
1326 
1327 
1328 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:696
subroutine getjacobian(fetype, nn, localcoord, elecoord, det, jacobian, inverse)
calculate Jacobian matrix, its determinant and inverse
Definition: element.f90:869
integer(kind=kind(2)) function getnumberofnodes(etype)
Obtain number of nodes of the element.
Definition: element.f90:131
integer, parameter fe_beam341
Definition: element.f90:89
integer, parameter fe_if_line2n
Definition: element.f90:85
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:1150
integer, parameter fe_tri3n_patch
Definition: element.f90:104
integer, parameter fe_unknown
Definition: element.f90:65
real(kind=kreal) function, dimension(2) edgenormal(fetype, nn, localcoord, elecoord)
Calculate normal of 2d-edge.
Definition: element.f90:954
subroutine getquadpoint(fetype, np, pos)
Fetch the coordinate of gauss point.
Definition: element.f90:538
subroutine getglobalderiv(fetype, nn, localcoord, elecoord, det, gderiv)
Calculate shape derivative in global coordinate system.
Definition: element.f90:790
integer, parameter fe_line2n
Definition: element.f90:67
subroutine getelementcenter(fetype, localcoord)
Return natural coordinate of the center of element.
Definition: element.f90:1061
integer, parameter fe_tri6n
Definition: element.f90:70
integer, parameter fe_prism6n
Definition: element.f90:79
integer, parameter fe_tet10nc
Definition: element.f90:78
integer(kind=kind(2)) function getnumberofsubface(etype)
Obtain number of sub-surface.
Definition: element.f90:168
subroutine getshellthicknessquadpoint(etype, np, zeta)
Fetch the through-thickness quadrature coordinate of a shell element.
Definition: element.f90:503
subroutine getsubface(intype, innumber, outtype, nodes)
Find the definition of surface of the element.
Definition: element.f90:193
integer, parameter fe_dsg3_shell
Definition: element.f90:92
subroutine getshapederiv(fetype, localcoord, shapederiv)
Calculate derivatives of shape function in natural coordinate system.
Definition: element.f90:627
integer, parameter fe_mitc3_shell361
Definition: element.f90:98
integer, parameter fe_prism15n
Definition: element.f90:80
integer function numofshellthicknessquadpoints(etype)
Obtains the number of through-thickness quadrature points of a shell element.
Definition: element.f90:489
subroutine getvertexcoord(fetype, cnode, localcoord)
Get the natural coord of a vertex node.
Definition: element.f90:1192
integer, parameter fe_hex20n
Definition: element.f90:82
integer, parameter fe_quad8n_patch
Definition: element.f90:107
integer, parameter fe_nodesmooth_tet4n
Definition: element.f90:101
integer, parameter fe_tri3n
Definition: element.f90:69
real(kind=kreal) function getdeterminant(fetype, nn, localcoord, elecoord)
Calculate shape derivative in global coordinate system.
Definition: element.f90:841
subroutine tangentbase(fetype, nn, localcoord, elecoord, tangent)
Calculate base vector of tangent space of 3d surface.
Definition: element.f90:982
integer, parameter fe_mitc4_shell
Definition: element.f90:94
integer, parameter fe_hex27n
Definition: element.f90:83
integer, parameter fe_truss
Definition: element.f90:74
integer, parameter fe_mitc9_shell
Definition: element.f90:96
integer, parameter fe_tet4n_pipi
Definition: element.f90:76
subroutine getshape2ndderiv(fetype, localcoord, shapederiv)
Calculate the 2nd derivative of shape function in natural coordinate system.
Definition: element.f90:671
real(kind=kreal) function getweight(fetype, np)
Fetch the weight value in given gauss point.
Definition: element.f90:584
integer, parameter fe_mitc4_shell361
Definition: element.f90:99
integer, parameter fe_quad4n
Definition: element.f90:72
integer, parameter fe_mitc8_shell
Definition: element.f90:95
integer, parameter fe_hex8n
Definition: element.f90:81
integer, parameter fe_tri6n_patch
Definition: element.f90:105
integer function numofquadpoints(fetype)
Obtains the number of quadrature points of the element.
Definition: element.f90:450
integer(kind=kind(2)) function getspacedimension(etype)
Obtain the space dimension of the element.
Definition: element.f90:117
subroutine extrapolatevalue(lpos, fetype, nnode, pvalue, ndvalue)
This subroutine extrapolate a point value into elemental nodes.
Definition: element.f90:1227
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:1085
integer, parameter fe_mitc3_shell
Definition: element.f90:93
integer, parameter fe_tri6nc
Definition: element.f90:71
real(kind=kreal) function, dimension(3) surfacenormal(fetype, nn, localcoord, elecoord)
Calculate normal of 3d-surface.
Definition: element.f90:919
subroutine getnodalnaturalcoord(fetype, nncoord)
Definition: element.f90:748
integer, parameter fe_beam2n
Definition: element.f90:87
real(kind=kreal) function getreferencelength(fetype, nn, localcoord, elecoord)
This function calculates reference length at a point in surface.
Definition: element.f90:1315
integer, parameter fe_line3n
Definition: element.f90:68
subroutine curvature(fetype, nn, localcoord, elecoord, l2ndderiv, normal, curv)
Calculate curvature tensor at a point along 3d surface.
Definition: element.f90:1016
integer, parameter fe_edgesmooth_tet4n
Definition: element.f90:102
integer, parameter fe_tet10n
Definition: element.f90:77
integer, parameter fe_tri6n_shell
Definition: element.f90:91
subroutine gauss2node(fetype, gaussv, nodev)
This subroutine extroplate value in quadrature point to element nodes.
Definition: element.f90:1260
subroutine interapolatevalue(lpos, fetype, nnode, pvalue, ndvalue)
This subroutine interapolate element nodes value into a point value.
Definition: element.f90:1243
real(kind=kreal) function getshellthicknessweight(etype, np)
Fetch the through-thickness quadrature weight of a shell element.
Definition: element.f90:521
integer, parameter fe_quad4n_patch
Definition: element.f90:106
integer, parameter fe_beam3n
Definition: element.f90:88
integer, parameter fe_quad8n
Definition: element.f90:73
integer, parameter fe_tet4n
Definition: element.f90:75
This module contains Gauss point information.
Definition: quadrature.f90:28
real(kind=kreal), dimension(3, 9) gauss3d8
Definition: quadrature.f90:32
real(kind=kreal), dimension(2, 1) gauss2d4
Definition: quadrature.f90:32
real(kind=kreal), dimension(3, 4) gauss3d5
Definition: quadrature.f90:32
real(kind=kreal), dimension(1) weight2d4
Definition: quadrature.f90:32
real(kind=kreal), dimension(3, 8) gauss3d2
Definition: quadrature.f90:32
real(kind=kreal), dimension(3, 2) gauss3d7
Definition: quadrature.f90:32
real(kind=kreal), dimension(2, 9) gauss2d3
Definition: quadrature.f90:32
real(kind=kreal), dimension(2, 4) gauss2d2
Definition: quadrature.f90:32
real(kind=kreal), dimension(9) weight3d8
Definition: quadrature.f90:32
real(kind=kreal), dimension(3, 1) gauss3d4
Definition: quadrature.f90:32
real(kind=kreal), dimension(2) weight1d2
Definition: quadrature.f90:32
real(kind=kreal), dimension(4) weight3d5
Definition: quadrature.f90:32
real(kind=kreal), dimension(2, 3) gauss2d5
Definition: quadrature.f90:32
real(kind=kreal), dimension(1, 2) gauss1d2
Definition: quadrature.f90:32
real(kind=kreal), dimension(2, 4) gauss2d6
Definition: quadrature.f90:32
real(kind=kreal), dimension(1, 3) gauss1d3
Definition: quadrature.f90:32
real(kind=kreal), dimension(27) weight3d3
Definition: quadrature.f90:32
real(kind=kreal), dimension(3, 27) gauss3d3
Definition: quadrature.f90:32
real(kind=kreal), dimension(3) weight1d3
Definition: quadrature.f90:32
real(kind=kreal), dimension(8) weight3d2
Definition: quadrature.f90:32
real(kind=kreal), dimension(9) weight2d3
Definition: quadrature.f90:32
real(kind=kreal), dimension(4) weight2d2
Definition: quadrature.f90:32
real(kind=kreal), dimension(2) weight3d7
Definition: quadrature.f90:32
real(kind=kreal), dimension(1) weight3d4
Definition: quadrature.f90:32
real(kind=kreal), dimension(3) weight2d5
Definition: quadrature.f90:32
real(kind=kreal), dimension(1) weight1d1
Definition: quadrature.f90:32
real(kind=kreal), dimension(1, 1) gauss1d1
Definition: quadrature.f90:32
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