10 private :: update_abort
30 type (hecmwST_matrix) :: hecMAT
31 type (hecmwST_local_mesh) :: hecMESH
32 type (fstr_solid) :: fstrSOLID
33 real(kind=kreal),
intent(in) :: time
34 real(kind=kreal),
intent(in) :: tincr
35 integer,
intent(in) :: iter
37 integer(kind=kint) :: nodLOCAL(fstrSOLID%max_ncon)
38 real(kind=kreal) :: ecoord(3, fstrsolid%max_ncon)
39 real(kind=kreal) :: thick, thick0(6)
40 integer(kind=kint) :: ndof, itype, is, iE, ic_type, nn, icel, iiS, i, j
42 real(kind=kreal) :: total_disp(6, fstrsolid%max_ncon), du(6, fstrsolid%max_ncon), ddu(6, fstrsolid%max_ncon)
43 real(kind=kreal) :: tt(fstrsolid%max_ncon), tt0(fstrsolid%max_ncon), ttn(fstrsolid%max_ncon)
44 real(kind=kreal) :: qf(fstrsolid%max_ncon*6), coords(3, 3)
45 integer :: isect, ihead, cdsys_ID
46 integer :: ndim, initt
48 real(kind=kreal),
optional :: strainenergy
49 real(kind=kreal) :: tmp
50 real(kind=kreal) :: ddaux(3,3)
53 fstrsolid%QFORCE=0.0d0
80 do itype = 1, hecmesh%n_elem_type
81 is = hecmesh%elem_type_index(itype-1)+1
82 ie = hecmesh%elem_type_index(itype )
83 ic_type= hecmesh%elem_type_item(itype)
84 if (hecmw_is_etype_link(ic_type)) cycle
85 if (hecmw_is_etype_patch(ic_type)) cycle
98 iis = hecmesh%elem_node_index(icel-1)
99 nn = hecmesh%elem_node_index(icel)-iis
103 do j = 1,
size(fstrsolid%elements(icel)%gausses)
104 thick0(1:6) = fstrsolid%elements(icel)%gausses(j)%stress(1:6)
105 thick = thick + dsqrt(dot_product(thick0(1:6),thick0(1:6)))
107 if( thick < 1.d-10 )
then
108 do j = 1,
size(fstrsolid%elements(icel)%gausses)
109 if(
associated(fstrsolid%elements(icel)%gausses(j)%fstatus) ) &
110 & fstrsolid%elements(icel)%gausses(j)%fstatus = 0.d0
115 nodlocal(j) = hecmesh%elem_node_item (iis+j)
117 ecoord(i,j) = hecmesh%node(3*nodlocal(j)+i-3)
120 ddu(i,j) = hecmat%X(ndof*nodlocal(j)+i-ndof)
121 du(i,j) = fstrsolid%dunode(ndof*nodlocal(j)+i-ndof)
122 total_disp(i,j) = fstrsolid%unode(ndof*nodlocal(j)+i-ndof)
125 if( fstrsolid%TEMP_ngrp_tot > 0 .or. fstrsolid%TEMP_irres > 0 )
then
126 if( iselastoplastic(fstrsolid%elements(icel)%gausses(1)%pMaterial%mtype) .or. &
127 fstrsolid%elements(icel)%gausses(1)%pMaterial%mtype == norton )
then
128 tt0(j)=fstrsolid%last_temp( nodlocal(j) )
131 if( hecmesh%hecmw_flag_initcon == 1 ) tt0(j) = hecmesh%node_init_val_item(nodlocal(j))
132 if( initt>0 ) tt0(j) =
g_initialcnd(initt)%realval(nodlocal(j))
134 ttn(j) = fstrsolid%last_temp( nodlocal(j) )
135 tt(j) = fstrsolid%temperature( nodlocal(j) )
139 isect = hecmesh%section_ID(icel)
140 ihead = hecmesh%section%sect_R_index(isect-1)
141 thick = hecmesh%section%sect_R_item(ihead+1)
142 cdsys_id = hecmesh%section%sect_orien_ID(isect)
143 if( cdsys_id > 0 )
call get_coordsys(cdsys_id, hecmesh, fstrsolid, coords)
146 if( ic_type == 241 .or. ic_type == 242 .or. ic_type == 231 .or. ic_type == 232 .or. ic_type == 2322 )
then
147 call update_c2( ic_type,nn,ecoord(1:3,1:nn),fstrsolid%elements(icel)%gausses(:), &
148 thick,fstrsolid%elements(icel)%iset, &
149 total_disp(1:2,1:nn), ddu(1:2,1:nn), qf(1:nn*ndof), &
150 tt(1:nn), tt0(1:nn), ttn(1:nn) )
152 else if( ic_type == 301 )
then
153 call update_c1( ic_type,nn,ecoord(:,1:nn), thick, total_disp(1:3,1:nn), du(1:3,1:nn), &
154 qf(1:nn*ndof),fstrsolid%elements(icel)%gausses(:) )
156 else if( ic_type == 361 )
then
157 if( fstrsolid%sections(isect)%elemopt361 ==
kel361fi )
then
158 call update_c3( ic_type, nn, ecoord(:,1:nn), total_disp(1:3,1:nn), du(1:3,1:nn), cdsys_id, coords, &
159 qf(1:nn*ndof), fstrsolid%elements(icel)%gausses(:), iter, time, tincr, tt(1:nn), tt0(1:nn), ttn(1:nn) )
160 else if( fstrsolid%sections(isect)%elemopt361 ==
kel361bbar )
then
161 call update_c3d8bbar( ic_type, nn, ecoord(:,1:nn), total_disp(1:3,1:nn), du(1:3,1:nn), cdsys_id, coords, &
162 qf(1:nn*ndof), fstrsolid%elements(icel)%gausses(:), iter, time, tincr, tt(1:nn), tt0(1:nn), ttn(1:nn) )
163 else if( fstrsolid%sections(isect)%elemopt361 ==
kel361ic )
then
164 call update_c3d8ic( ic_type,nn,ecoord(:,1:nn), total_disp(1:3,1:nn), du(1:3,1:nn), ddu(1:3,1:nn), cdsys_id, coords,&
165 qf(1:nn*ndof), fstrsolid%elements(icel)%gausses(:), iter, time, tincr, &
166 fstrsolid%elements(icel)%aux, ddaux(1:3,1:3), tt(1:nn), tt0(1:nn), ttn(1:nn) )
167 fstrsolid%elements(icel)%aux(1:3,1:3) = fstrsolid%elements(icel)%aux(1:3,1:3) + ddaux(1:3,1:3)
168 else if( fstrsolid%sections(isect)%elemopt361 ==
kel361fbar )
then
169 call update_c3d8fbar( ic_type, nn, ecoord(:,1:nn), total_disp(1:3,1:nn), du(1:3,1:nn), cdsys_id, coords, &
170 qf(1:nn*ndof), fstrsolid%elements(icel)%gausses(:), iter, time, tincr, tt(1:nn), tt0(1:nn), ttn(1:nn) )
173 else if (ic_type == 341 .or. ic_type == 351 .or. ic_type == 342 .or. ic_type == 352 .or. ic_type == 362 )
then
174 if( ic_type==341 .and. fstrsolid%sections(isect)%elemopt341 ==
kel341sesns ) cycle
175 call update_c3( ic_type, nn, ecoord(:,1:nn), total_disp(1:3,1:nn), du(1:3,1:nn), cdsys_id, coords, &
176 qf(1:nn*ndof), fstrsolid%elements(icel)%gausses(:), iter, time, tincr, tt(1:nn), tt0(1:nn), ttn(1:nn) )
178 else if( ic_type == 511)
then
179 call update_connector( ic_type,nn,ecoord(:,1:nn), total_disp(1:3,1:nn), du(1:3,1:nn), &
180 qf(1:nn*ndof),fstrsolid%elements(icel)%gausses(:), tincr )
182 else if( ic_type == 611)
then
183 if(
fstrpr%nlgeom )
call update_abort( ic_type, 2 )
184 CALL updatest_beam(ic_type, nn, ecoord, total_disp(1:6,1:nn), du(1:6,1:nn), &
185 & hecmesh%section%sect_R_item(ihead+1:), fstrsolid%elements(icel)%gausses(:), qf(1:nn*ndof))
187 else if( ic_type == 641 )
then
188 if(
fstrpr%nlgeom )
call update_abort( ic_type, 2 )
189 call updatest_beam_641(ic_type, nn, ecoord, total_disp(1:ndof,1:nn), du(1:ndof,1:nn), &
190 & fstrsolid%elements(icel)%gausses(:), hecmesh%section%sect_R_item(ihead+1:), qf(1:nn*ndof))
192 else if( ( ic_type == 741 ) .or. ( ic_type == 743 ) .or. ( ic_type == 731 ) )
then
193 if(
fstrpr%nlgeom )
call update_abort( ic_type, 2 )
194 call updatest_shell_mitc(ic_type, nn, ndof, ecoord(1:3, 1:nn), total_disp(1:ndof,1:nn), du(1:ndof,1:nn), &
195 & fstrsolid%elements(icel)%gausses(:), qf(1:nn*ndof), thick, 0)
197 else if( ic_type == 761 )
then
198 if(
fstrpr%nlgeom )
call update_abort( ic_type, 2 )
199 call updatest_shell_mitc33(731, 3, 6, ecoord(1:3, 1:3), total_disp(1:ndof,1:nn), du(1:ndof,1:nn), &
200 & fstrsolid%elements(icel)%gausses(:), qf(1:nn*ndof), thick, 2)
202 else if( ic_type == 781 )
then
203 if(
fstrpr%nlgeom )
call update_abort( ic_type, 2 )
204 call updatest_shell_mitc33(741, 4, 6, ecoord(1:3, 1:4), total_disp(1:ndof,1:nn), du(1:ndof,1:nn), &
205 & fstrsolid%elements(icel)%gausses(:), qf(1:nn*ndof), thick, 1)
207 else if ( ic_type == 3414 )
then
208 if(fstrsolid%elements(icel)%gausses(1)%pMaterial%mtype /= incomp_newtonian) &
209 &
call update_abort( ic_type, 3, fstrsolid%elements(icel)%gausses(1)%pMaterial%mtype )
211 ( ic_type, nn, ecoord(:,1:nn), total_disp(1:4,1:nn), du(1:4,1:nn), &
212 fstrsolid%elements(icel)%gausses(:) )
215 else if ( ic_type == 881 .or. ic_type == 891 )
then
216 call update_c3_sesns( ic_type, nn, nodlocal, ecoord(:,1:nn), total_disp(1:3,1:nn), du(1:3,1:nn), cdsys_id, coords, &
217 qf(1:nn*ndof), fstrsolid%elements(icel)%gausses(:), time, tincr, tt(1:nn), tt0(1:nn), ttn(1:nn) )
220 write(*, *)
'###ERROR### : Element type not supported for nonlinear static analysis'
221 write(*, *)
' ic_type = ', ic_type
222 call hecmw_abort(hecmw_comm_get_comm())
228 call update_dummy( ndof, nn, ecoord(:,1:nn), total_disp(1:3,1:nn), &
229 & du(1:3,1:nn), qf(1:nn*ndof), fstrsolid%elements(icel) )
237 fstrsolid%QFORCE(ndof*(nodlocal(j)-1)+i) = fstrsolid%QFORCE(ndof*(nodlocal(j)-1)+i)+qf(ndof*(j-1)+i)
242 if(
present(strainenergy))
then
243 ndim = getspacedimension( fstrsolid%elements(icel)%etype )
246 tmp = 0.5d0*( fstrsolid%elements(icel)%equiForces(ndim*(j-1)+i)+qf(ndim*(j-1)+i) )*ddu(i,j)
248 strainenergy = strainenergy+tmp
249 fstrsolid%elements(icel)%equiForces(ndim*(j-1)+i) = qf(ndim*(j-1)+i)
262 call hecmw_update_r(hecmesh,fstrsolid%QFORCE,hecmesh%n_node, ndof)
273 type(hecmwst_local_mesh) :: hecmesh
275 real(kind=kreal) :: tincr
276 integer(kind=kint) :: itype, is, iE, ic_type, icel, ngauss, i
278 if(
associated( fstrsolid%temperature ) )
then
279 do i = 1, hecmesh%n_node
280 fstrsolid%last_temp(i) = fstrsolid%temperature(i)
284 do itype = 1, hecmesh%n_elem_type
285 is = hecmesh%elem_type_index(itype-1) + 1
286 ie = hecmesh%elem_type_index(itype )
287 ic_type= hecmesh%elem_type_item(itype)
288 if( ic_type == 301 ) ic_type = 111
289 if( hecmw_is_etype_link(ic_type) ) cycle
290 if( hecmw_is_etype_patch(ic_type) ) cycle
292 ngauss = numofquadpoints( ic_type )
294 if( iselastoplastic( fstrsolid%elements(icel)%gausses(1)%pMaterial%mtype ) )
then
298 elseif( fstrsolid%elements(icel)%gausses(1)%pMaterial%mtype == norton )
then
299 if( tincr>0.d0 )
then
304 elseif( isviscoelastic( fstrsolid%elements(icel)%gausses(1)%pMaterial%mtype ) )
then
305 if( tincr > 0.d0 )
then
313 fstrsolid%elements(icel)%gausses(i)%strain_bak = fstrsolid%elements(icel)%gausses(i)%strain
314 fstrsolid%elements(icel)%gausses(i)%stress_bak = fstrsolid%elements(icel)%gausses(i)%stress
315 fstrsolid%elements(icel)%gausses(i)%strain_energy_bak = fstrsolid%elements(icel)%gausses(i)%strain_energy
320 do i = 1, hecmesh%n_node
321 fstrsolid%QFORCE_bak(i) = fstrsolid%QFORCE(i)
326 subroutine update_abort( ic_type, flag, mtype )
327 integer(kind=kint),
intent(in) :: ic_type
328 integer(kind=kint),
intent(in) :: flag
329 integer(kind=kint),
intent(in),
optional :: mtype
332 write(*,*)
'###ERROR### : Element type not supported for static analysis'
333 else if( flag == 2 )
then
334 write(*,*)
'###ERROR### : Element type not supported for nonlinear static analysis'
335 else if( flag == 3 )
then
336 write(*,*)
'###ERROR### : This element is not supported for this material'
338 write(*,*)
' ic_type = ', ic_type
339 if(
present(mtype) )
write(*,*)
' mtype = ', mtype
340 call hecmw_abort(hecmw_comm_get_comm())
This module provide functions for elastoplastic calculation.
subroutine, public updateepstate(gauss)
Clear elatoplastic state.
This module defined elemact data and function.
subroutine update_dummy(ndof, nn, ecoord, u, du, qf, element)
integer, parameter kelact_inactive
This module provides function to calculate to do updates.
subroutine fstr_updatestate(hecMESH, fstrSOLID, tincr)
Update elastiplastic status.
subroutine fstr_updatenewton(hecMESH, hecMAT, fstrSOLID, time, tincr, iter, strainEnergy)
Update displacement, stress, strain and internal forces.
This module defines common data and basic structures for analysis.
integer(kind=kint), parameter kel361bbar
subroutine get_coordsys(cdsys_ID, hecMESH, fstrSOLID, coords)
This subroutine fetch coords defined by local coordinate system.
integer(kind=kint), parameter kel341sesns
integer(kind=kint), parameter kel361fi
integer(kind=kint), parameter kel361ic
type(fstr_param), target fstrpr
GLOBAL VARIABLE INITIALIZED IN FSTR_SETUP.
integer(kind=kint), parameter kel361fbar
type(tinitialcondition), dimension(:), pointer, save g_initialcnd
This modules just summarizes all modules used in static analysis.
This module provides functions for creep calculation.
subroutine updateviscostate(gauss)
Update viscoplastic state.
This module provides functions for viscoelastic calculation.
subroutine updateviscoelasticstate(gauss)
Update viscoplastic state.