FrontISTR  5.9.0
Large-scale structural analysis program with finit element method
fstr_EIG_setMASS.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 !-------------------------------------------------------------------------------
7 
8  use m_eigen_lib
10  use m_dynamic_mass
11  use m_fstr
12 
13 contains
14 
15  subroutine setmass(fstrSOLID, hecMESH, hecMAT, fstrEIG)
16  use hecmw_util
17  use m_fstr
18  use mmaterial
20  implicit none
21  type(hecmwst_matrix) :: hecMAT
22  type(hecmwst_local_mesh) :: hecMESH
23  type(fstr_solid) :: fstrSOLID
24  type(fstr_eigen) :: fstrEIG
25  integer(kind=kint) :: i, iS, iE, ii, nn, j, jn, jS, k
26  integer(kind=kint) :: N, NP, NDOF
27  integer(kind=kint) :: icel, ic_type, itype, isect, ihead, sec_opt, cid
28  integer(kind=kint) :: nodLOCAL(20)
29  real(kind=kreal) :: val, surf, chkmass
30  real(kind=kreal) :: rho, thick, length
31  real(kind=kreal) :: lumped(120), mass(20*6, 20*6), ecoord(3,20)
32 
33  if(myrank == 0)then
34  write(imsg,*)"* mass matrix generation"
35  endif
36 
37  n = hecmat%N
38  np = hecmat%NP
39  ndof = hecmesh%n_dof
40 
41  allocate(fstreig%mass(np*ndof))
42  fstreig%mass = 0.0d0
43  val = 0.0d0
44 
45  do itype = 1, hecmesh%n_elem_type
46  is = hecmesh%elem_type_index(itype-1) + 1
47  ie = hecmesh%elem_type_index(itype )
48  ic_type = hecmesh%elem_type_item(itype)
49  nn = hecmw_get_max_node(ic_type)
50 
51  if(hecmw_is_etype_link(ic_type)) cycle
52  if(hecmw_is_etype_patch(ic_type)) cycle
53  if(ic_type == 3414) cycle
54  if(ic_type == 881 .or. ic_type == 891) cycle !skip selective ES/NS smoothed elements (mass uses original 341)
55 
56  do icel = is, ie
57  js = hecmesh%elem_node_index(icel-1)
58  do j = 1, nn
59  nodlocal(j) = hecmesh%elem_node_item(js+j)
60  do i = 1, 3
61  ecoord(i,j) = hecmesh%node(3*(nodlocal(j)-1)+i)
62  enddo
63  enddo
64 
65  isect = hecmesh%section_ID(icel)
66  ihead = hecmesh%section%sect_R_index(isect-1)
67  cid = hecmesh%section%sect_mat_ID_item(isect)
68  sec_opt = hecmesh%section%sect_opt(isect)
69  rho = fstrsolid%materials(cid)%variables(m_density)
70  thick = fstrsolid%materials(cid)%variables(m_thick)
71 
72  lumped = 0.0d0
73  if(ic_type == 231 .or. ic_type == 232 .or. ic_type == 241 .or. ic_type == 242)then
74  call mass_c2(ic_type, nn, ecoord(1:2,1:nn), fstrsolid%elements(icel)%gausses, sec_opt, thick, mass, lumped)
75 
76  elseif(ic_type == 341 .or. ic_type == 342 .or. ic_type == 351 .or. ic_type == 352 .or. &
77  & ic_type == 361 .or. ic_type == 362 )then
78  call mass_c3(ic_type, nn, ecoord(1:3,1:nn), fstrsolid%elements(icel)%gausses, mass, lumped)
79 
80  elseif(ic_type==731 .or. ic_type==741 .or. ic_type==743) then
81  rho = fstrsolid%materials(cid)%variables(m_density)
82  thick = fstrsolid%materials(cid)%variables(m_thick)
83  call mass_shell(ic_type, nn, ecoord(1:3,1:nn), rho, thick, fstrsolid%elements(icel)%gausses, mass, lumped)
84 
85  elseif(ic_type == 761)then
86  surf = get_face3(ecoord(1:3,1:nn))
87  rho = fstrsolid%materials(cid)%variables(m_density)
88  thick = fstrsolid%materials(cid)%variables(m_thick)
89  val = surf*thick*rho/3.0d0
90 
91  elseif(ic_type == 781)then
92  surf = get_face4(ecoord(1:3,1:nn))
93  rho = fstrsolid%materials(cid)%variables(m_density)
94  thick = fstrsolid%materials(cid)%variables(m_thick)
95  val = surf*thick*rho/4.0d0
96 
97  elseif(ic_type == 611 .or. ic_type == 641)then
98  surf = hecmesh%section%sect_R_item(ihead+4)
99  length = get_length(ecoord(1:3,1:nn))
100  rho = fstrsolid%materials(cid)%variables(m_density)
101  val = 0.5d0*surf*length*rho
102 
103  elseif(ic_type == 301)then
104  surf = hecmesh%section%sect_R_item(ihead+1)
105  length = get_length(ecoord(1:3,1:nn))
106  rho = fstrsolid%materials(cid)%variables(m_density)
107  val = 0.5d0*surf*length*rho
108 
109  elseif( ic_type/100 == 5 )then !skip interface element
110  else
111  write(*,*)"** error setMASS"
112  endif
113 
114  do j = 1,nn
115  jn = nodlocal(j)
116  js = ndof*(jn-1)
117 
118  if(ic_type == 611)then
119  fstreig%mass(js+1) = fstreig%mass(js+1) + val
120  fstreig%mass(js+2) = fstreig%mass(js+2) + val
121  fstreig%mass(js+3) = fstreig%mass(js+3) + val
122  fstreig%mass(js+4) = fstreig%mass(js+4) + 0.0d0
123  fstreig%mass(js+5) = fstreig%mass(js+5) + 0.0d0
124  fstreig%mass(js+6) = fstreig%mass(js+6) + 0.0d0
125 
126  elseif(ic_type == 641)then
127  if(j == 1 .or. j == 2)then
128  fstreig%mass(js+1) = fstreig%mass(js+1) + val
129  fstreig%mass(js+2) = fstreig%mass(js+2) + val
130  fstreig%mass(js+3) = fstreig%mass(js+3) + val
131  elseif(j == 3 .or. j == 4)then
132  fstreig%mass(js+1) = fstreig%mass(js+1) + 0.0d0
133  fstreig%mass(js+2) = fstreig%mass(js+2) + 0.0d0
134  fstreig%mass(js+3) = fstreig%mass(js+3) + 0.0d0
135  end if
136 
137  elseif(ic_type == 761)then
138  if(j == 1 .or. j == 2 .or. j == 3)then
139  fstreig%mass(js+1) = fstreig%mass(js+1) + val
140  fstreig%mass(js+2) = fstreig%mass(js+2) + val
141  fstreig%mass(js+3) = fstreig%mass(js+3) + val
142  elseif(j == 4 .or. j == 5 .or. j == 6)then
143  fstreig%mass(js+1) = fstreig%mass(js+1) + 0.0d0
144  fstreig%mass(js+2) = fstreig%mass(js+2) + 0.0d0
145  fstreig%mass(js+3) = fstreig%mass(js+3) + 0.0d0
146  endif
147 
148  else if( ic_type == 781 ) then
149  if(j == 1 .or. j == 2 .or. j == 3 .or. j == 4)then
150  fstreig%mass(js+1) = fstreig%mass(js+1) + val
151  fstreig%mass(js+2) = fstreig%mass(js+2) + val
152  fstreig%mass(js+3) = fstreig%mass(js+3) + val
153  elseif(j == 5 .or. j == 6 .or. j == 7 .or. j == 8)then
154  fstreig%mass(js+1) = fstreig%mass(js+1) + 0.0d0
155  fstreig%mass(js+2) = fstreig%mass(js+2) + 0.0d0
156  fstreig%mass(js+3) = fstreig%mass(js+3) + 0.0d0
157  endif
158 
159  elseif(ic_type == 301) then
160  fstreig%mass(js+1) = fstreig%mass(js+1) + val
161  fstreig%mass(js+2) = fstreig%mass(js+2) + val
162  fstreig%mass(js+3) = fstreig%mass(js+3) + val
163 
164  else
165  do k = 1, ndof
166  fstreig%mass(js+k) = fstreig%mass(js+k) + lumped(ndof*(j-1)+k)
167  enddo
168  endif
169  enddo
170  enddo
171  enddo
172 
173  call hecmw_update_r(hecmesh, fstreig%mass, np, ndof)
174 
175  chkmass = 0.0d0
176  do i = 1, n
177  ii = ndof*(i-1) + 1
178  chkmass = chkmass + fstreig%mass(ii)
179  end do
180  call hecmw_allreduce_r1(hecmesh, chkmass, hecmw_sum)
181  fstreig%totalmass = chkmass
182 
183  if(myrank == 0)then
184  write(imsg,"(a,1pe12.5)")"** Total mass: ", chkmass
185  endif
186  end subroutine setmass
187 
188 end module m_fstr_eig_setmass
189 
I/O and Utility.
Definition: hecmw_util_f.F90:7
integer(kind=kint), parameter hecmw_sum
integer(kind=4), parameter kreal
This module contains subroutines used in 3d eigen analysis for.
Definition: dynamic_mass.f90:6
real(kind=kreal) function get_length(ecoord)
subroutine mass_c2(etype, nn, ecoord, gausses, sec_opt, thick, mass, lumped, temperature)
real(kind=kreal) function get_face4(ecoord)
real(kind=kreal) function get_face3(ecoord)
subroutine mass_c3(etype, nn, ecoord, gausses, mass, lumped, temperature)
This modules just summarizes all modules used in eigen analysis.
Definition: eigen_LIB.f90:6
Set up lumped mass matrix.
subroutine setmass(fstrSOLID, hecMESH, hecMAT, fstrEIG)
This module defines common data and basic structures for analysis.
Definition: m_fstr.F90:15
integer(kind=kint) myrank
PARALLEL EXECUTION.
Definition: m_fstr.F90:98
integer(kind=kint), parameter imsg
Definition: m_fstr.F90:112
This module provides a function to fetch material properties from hecmw.
This module ...
subroutine mass_shell(etype, nn, elem, rho, thick, gausses, mass, lumped)
This module summarizes all information of material properties.
Definition: material.f90:6
integer(kind=kint), parameter m_density
Definition: material.f90:94
integer(kind=kint), parameter m_thick
Definition: material.f90:95
Package of data used by Lanczos eigenvalue solver.
Definition: m_fstr.F90:604