10 private :: update_abort
33 type (hecmwST_matrix) :: hecMAT
34 type (hecmwST_local_mesh) :: hecMESH
35 type (fstr_solid) :: fstrSOLID
36 real(kind=kreal),
intent(in) :: time
37 real(kind=kreal),
intent(in) :: tincr
38 integer,
intent(in) :: iter
40 integer(kind=kint) :: nodLOCAL(fstrSOLID%max_ncon)
41 real(kind=kreal) :: ecoord(3, fstrsolid%max_ncon)
42 real(kind=kreal) :: thick, thick0(6)
43 integer(kind=kint) :: ndof, itype, is, iE, ic_type, nn, icel, iiS, i, j
45 real(kind=kreal) :: total_disp(6, fstrsolid%max_ncon), du(6, fstrsolid%max_ncon), ddu(6, fstrsolid%max_ncon)
46 real(kind=kreal) :: shell_director(3, fstrsolid%max_ncon)
47 real(kind=kreal) :: shell_ref_director(3, fstrsolid%max_ncon)
48 real(kind=kreal) :: tt(fstrsolid%max_ncon), tt0(fstrsolid%max_ncon), ttn(fstrsolid%max_ncon)
49 real(kind=kreal) :: qf(fstrsolid%max_ncon*6), coords(3, 3)
50 integer :: isect, ihead, cdsys_ID
51 integer :: ndim, initt
53 real(kind=kreal),
optional :: strainenergy
54 real(kind=kreal) :: tmp, lambda(1), ddlambda(1)
55 real(kind=kreal) :: ddaux(3,3)
58 fstrsolid%QFORCE=0.0d0
86 do itype = 1, hecmesh%n_elem_type
87 is = hecmesh%elem_type_index(itype-1)+1
88 ie = hecmesh%elem_type_index(itype )
89 ic_type= hecmesh%elem_type_item(itype)
90 if (hecmw_is_etype_link(ic_type)) cycle
91 if (hecmw_is_etype_patch(ic_type)) cycle
105 iis = hecmesh%elem_node_index(icel-1)
106 nn = hecmesh%elem_node_index(icel)-iis
110 do j = 1,
size(fstrsolid%elements(icel)%gausses)
111 thick0(1:6) = fstrsolid%elements(icel)%gausses(j)%stress(1:6)
112 thick = thick + dsqrt(dot_product(thick0(1:6),thick0(1:6)))
114 if( thick < 1.d-10 )
then
115 do j = 1,
size(fstrsolid%elements(icel)%gausses)
116 if(
associated(fstrsolid%elements(icel)%gausses(j)%fstatus) ) &
117 & fstrsolid%elements(icel)%gausses(j)%fstatus = 0.d0
122 nodlocal(j) = hecmesh%elem_node_item (iis+j)
124 ecoord(i,j) = hecmesh%node(3*nodlocal(j)+i-3)
127 ddu(i,j) = hecmat%X(ndof*nodlocal(j)+i-ndof)
128 du(i,j) = fstrsolid%dunode(ndof*nodlocal(j)+i-ndof)
129 total_disp(i,j) = fstrsolid%unode(ndof*nodlocal(j)+i-ndof)
132 if( fstrsolid%TEMP_ngrp_tot > 0 .or. fstrsolid%TEMP_irres > 0 )
then
133 if( iselastoplastic(fstrsolid%elements(icel)%gausses(1)%pMaterial%mtype) .or. &
134 fstrsolid%elements(icel)%gausses(1)%pMaterial%mtype == norton )
then
135 tt0(j)=fstrsolid%last_temp( nodlocal(j) )
138 if( hecmesh%hecmw_flag_initcon == 1 ) tt0(j) = hecmesh%node_init_val_item(nodlocal(j))
139 if( initt>0 ) tt0(j) =
g_initialcnd(initt)%realval(nodlocal(j))
141 ttn(j) = fstrsolid%last_temp( nodlocal(j) )
142 tt(j) = fstrsolid%temperature( nodlocal(j) )
146 isect = hecmesh%section_ID(icel)
147 ihead = hecmesh%section%sect_R_index(isect-1)
148 thick = hecmesh%section%sect_R_item(ihead+1)
149 cdsys_id = hecmesh%section%sect_orien_ID(isect)
150 if( cdsys_id > 0 )
call get_coordsys(cdsys_id, hecmesh, fstrsolid, coords)
153 if( ic_type == 241 .or. ic_type == 242 .or. ic_type == 231 .or. ic_type == 232 .or. ic_type == 2322 )
then
154 call update_c2( ic_type,nn,ecoord(1:3,1:nn),fstrsolid%elements(icel)%gausses(:), &
155 thick,fstrsolid%elements(icel)%iset, &
156 total_disp(1:2,1:nn), ddu(1:2,1:nn), qf(1:nn*ndof), &
157 tt(1:nn), tt0(1:nn), ttn(1:nn) )
159 else if( ic_type == 301 )
then
160 call update_c1( ic_type,nn,ecoord(:,1:nn), thick, total_disp(1:3,1:nn), du(1:3,1:nn), &
161 qf(1:nn*ndof),fstrsolid%elements(icel)%gausses(:) )
163 else if( ic_type == 361 )
then
164 if( fstrsolid%sections(isect)%elemopt361 ==
kel361fi )
then
165 call update_c3( ic_type, nn, ecoord(:,1:nn), total_disp(1:3,1:nn), du(1:3,1:nn), cdsys_id, coords, &
166 qf(1:nn*ndof), fstrsolid%elements(icel)%gausses(:), iter, time, tincr, tt(1:nn), tt0(1:nn), ttn(1:nn) )
167 else if( fstrsolid%sections(isect)%elemopt361 ==
kel361bbar )
then
168 call update_c3d8bbar( ic_type, nn, ecoord(:,1:nn), total_disp(1:3,1:nn), du(1:3,1:nn), cdsys_id, coords, &
169 qf(1:nn*ndof), fstrsolid%elements(icel)%gausses(:), iter, time, tincr, tt(1:nn), tt0(1:nn), ttn(1:nn) )
170 else if( fstrsolid%sections(isect)%elemopt361 ==
kel361ic )
then
171 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,&
172 qf(1:nn*ndof), fstrsolid%elements(icel)%gausses(:), iter, time, tincr, &
173 fstrsolid%elements(icel)%aux, ddaux(1:3,1:3), tt(1:nn), tt0(1:nn), ttn(1:nn) )
174 fstrsolid%elements(icel)%aux(1:3,1:3) = fstrsolid%elements(icel)%aux(1:3,1:3) + ddaux(1:3,1:3)
175 else if( fstrsolid%sections(isect)%elemopt361 ==
kel361fbar )
then
176 call update_c3d8fbar( ic_type, nn, ecoord(:,1:nn), total_disp(1:3,1:nn), du(1:3,1:nn), cdsys_id, coords, &
177 qf(1:nn*ndof), fstrsolid%elements(icel)%gausses(:), iter, time, tincr, tt(1:nn), tt0(1:nn), ttn(1:nn) )
178 else if( fstrsolid%sections(isect)%elemopt361 ==
kel361up )
then
179 lambda(1) = -0.5d0*fstrsolid%elements(icel)%p(1)
181 ( ic_type, nn, ecoord(:,1:nn), total_disp(1:3,1:nn), du(1:3,1:nn), ddu(1:3,1:nn), &
182 cdsys_id, coords, qf(1:nn*ndof), fstrsolid%elements(icel)%gausses(:), &
183 iter, time, tincr, 1, lambda, ddlambda, tt(1:nn), tt0(1:nn) )
184 lambda(1) = lambda(1) + ddlambda(1)
185 fstrsolid%elements(icel)%p(1) = -2.0d0*lambda(1)
187 else if (ic_type == 341 .or. ic_type == 351 .or. ic_type == 342 .or. ic_type == 352 .or. ic_type == 362 )
then
188 if( ic_type==341 .and. fstrsolid%sections(isect)%elemopt341 ==
kel341sesns ) cycle
189 call update_c3( ic_type, nn, ecoord(:,1:nn), total_disp(1:3,1:nn), du(1:3,1:nn), cdsys_id, coords, &
190 qf(1:nn*ndof), fstrsolid%elements(icel)%gausses(:), iter, time, tincr, tt(1:nn), tt0(1:nn), ttn(1:nn) )
192 else if( ic_type == 511)
then
193 call update_connector( ic_type,nn,ecoord(:,1:nn), total_disp(1:3,1:nn), du(1:3,1:nn), &
194 qf(1:nn*ndof),fstrsolid%elements(icel)%gausses(:) )
196 else if( ic_type == 611)
then
197 if(
fstrpr%nlgeom )
call update_abort( ic_type, 2 )
198 CALL updatest_beam(ic_type, nn, ecoord, total_disp(1:6,1:nn), du(1:6,1:nn), &
199 & hecmesh%section%sect_R_item(ihead+1:), fstrsolid%elements(icel)%gausses(:), qf(1:nn*ndof))
201 else if( ic_type == 641 )
then
202 if(
fstrpr%nlgeom )
call update_abort( ic_type, 2 )
203 call updatest_beam_641(ic_type, nn, ecoord, total_disp(1:ndof,1:nn), du(1:ndof,1:nn), &
204 & fstrsolid%elements(icel)%gausses(:), hecmesh%section%sect_R_item(ihead+1:), qf(1:nn*ndof))
206 else if( ( ic_type == 741 ) .or. ( ic_type == 743 ) .or. ( ic_type == 731 ) )
then
208 fstrsolid%elements(icel)%gausses(1)%pMaterial ) )
then
211 shell_ref_director(1:3,1:nn) )
212 call updatest_shell_mitc(ic_type, nn, ndof, ecoord(1:3, 1:nn), total_disp(1:ndof,1:nn), du(1:ndof,1:nn), &
213 & fstrsolid%elements(icel)%gausses(:), qf(1:nn*ndof), thick, 0, &
214 & element=fstrsolid%elements(icel), nddirector=shell_director(1:3,1:nn), &
215 & ndrefdirector=shell_ref_director(1:3,1:nn))
217 if(
fstrpr%nlgeom )
call update_abort( ic_type, 2 )
218 call updatest_shell_mitc(ic_type, nn, ndof, ecoord(1:3, 1:nn), total_disp(1:ndof,1:nn), &
219 & du(1:ndof,1:nn), fstrsolid%elements(icel)%gausses(:), qf(1:nn*ndof), thick, 0)
222 else if( ic_type == 761 )
then
223 if(
fstrpr%nlgeom )
call update_abort( ic_type, 2 )
224 call updatest_shell_mitc33(731, 3, 6, ecoord(1:3, 1:3), total_disp(1:ndof,1:nn), du(1:ndof,1:nn), &
225 & fstrsolid%elements(icel)%gausses(:), qf(1:nn*ndof), thick, 2)
227 else if( ic_type == 781 )
then
228 if(
fstrpr%nlgeom )
call update_abort( ic_type, 2 )
229 call updatest_shell_mitc33(741, 4, 6, ecoord(1:3, 1:4), total_disp(1:ndof,1:nn), du(1:ndof,1:nn), &
230 & fstrsolid%elements(icel)%gausses(:), qf(1:nn*ndof), thick, 1)
232 else if ( ic_type == 3414 )
then
233 if(fstrsolid%elements(icel)%gausses(1)%pMaterial%mtype /= incomp_newtonian) &
234 &
call update_abort( ic_type, 3, fstrsolid%elements(icel)%gausses(1)%pMaterial%mtype )
236 ( ic_type, nn, ecoord(:,1:nn), total_disp(1:4,1:nn), du(1:4,1:nn), &
237 fstrsolid%elements(icel)%gausses(:) )
240 else if ( ic_type == 881 .or. ic_type == 891 )
then
241 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, &
242 qf(1:nn*ndof), fstrsolid%elements(icel)%gausses(:), time, tincr, tt(1:nn), tt0(1:nn), ttn(1:nn) )
245 write(*, *)
'###ERROR### : Element type not supported for nonlinear static analysis'
246 write(*, *)
' ic_type = ', ic_type
247 call hecmw_abort(hecmw_comm_get_comm())
253 call update_dummy( ndof, nn, ecoord(:,1:nn), total_disp(1:3,1:nn), &
254 & du(1:3,1:nn), qf(1:nn*ndof), fstrsolid%elements(icel) )
262 fstrsolid%QFORCE(ndof*(nodlocal(j)-1)+i) = fstrsolid%QFORCE(ndof*(nodlocal(j)-1)+i)+qf(ndof*(j-1)+i)
267 if(
present(strainenergy))
then
268 ndim = getspacedimension( fstrsolid%elements(icel)%etype )
271 tmp = 0.5d0*( fstrsolid%elements(icel)%equiForces(ndim*(j-1)+i)+qf(ndim*(j-1)+i) )*ddu(i,j)
273 strainenergy = strainenergy+tmp
274 fstrsolid%elements(icel)%equiForces(ndim*(j-1)+i) = qf(ndim*(j-1)+i)
287 call hecmw_update_r(hecmesh,fstrsolid%QFORCE,hecmesh%n_node, ndof)
298 type(hecmwst_local_mesh) :: hecmesh
300 real(kind=kreal) :: tincr
301 integer(kind=kint) :: itype, is, iE, ic_type, icel, ngauss, i
302 integer(kind=kint) :: ishell
304 if(
associated( fstrsolid%temperature ) )
then
305 do i = 1, hecmesh%n_node
306 fstrsolid%last_temp(i) = fstrsolid%temperature(i)
310 do itype = 1, hecmesh%n_elem_type
311 is = hecmesh%elem_type_index(itype-1) + 1
312 ie = hecmesh%elem_type_index(itype )
313 ic_type= hecmesh%elem_type_item(itype)
314 if( ic_type == 301 ) ic_type = 111
315 if( hecmw_is_etype_link(ic_type) ) cycle
316 if( hecmw_is_etype_patch(ic_type) ) cycle
318 ngauss = numofquadpoints( ic_type )
320 if( iselastoplastic( fstrsolid%elements(icel)%gausses(1)%pMaterial%mtype ) )
then
324 elseif( fstrsolid%elements(icel)%gausses(1)%pMaterial%mtype == norton )
then
325 if( tincr>0.d0 )
then
330 elseif( isviscoelastic( fstrsolid%elements(icel)%gausses(1)%pMaterial%mtype ) )
then
331 if( tincr > 0.d0 )
then
339 fstrsolid%elements(icel)%gausses(i)%strain_bak = fstrsolid%elements(icel)%gausses(i)%strain
340 fstrsolid%elements(icel)%gausses(i)%stress_bak = fstrsolid%elements(icel)%gausses(i)%stress
341 fstrsolid%elements(icel)%gausses(i)%strain_energy_bak = fstrsolid%elements(icel)%gausses(i)%strain_energy
344 if(
associated( fstrsolid%elements(icel)%shell_layer_gausses ) )
then
345 do ishell = 1,
size( fstrsolid%elements(icel)%shell_layer_gausses )
346 fstrsolid%elements(icel)%shell_layer_gausses(ishell)%strain_bak = &
347 fstrsolid%elements(icel)%shell_layer_gausses(ishell)%strain
348 fstrsolid%elements(icel)%shell_layer_gausses(ishell)%stress_bak = &
349 fstrsolid%elements(icel)%shell_layer_gausses(ishell)%stress
350 fstrsolid%elements(icel)%shell_layer_gausses(ishell)%strain_energy_bak = &
351 fstrsolid%elements(icel)%shell_layer_gausses(ishell)%strain_energy
357 do i = 1, hecmesh%n_node
358 fstrsolid%QFORCE_bak(i) = fstrsolid%QFORCE(i)
363 subroutine update_abort( ic_type, flag, mtype )
364 integer(kind=kint),
intent(in) :: ic_type
365 integer(kind=kint),
intent(in) :: flag
366 integer(kind=kint),
intent(in),
optional :: mtype
369 write(*,*)
'###ERROR### : Element type not supported for static analysis'
370 else if( flag == 2 )
then
371 write(*,*)
'###ERROR### : Element type not supported for nonlinear static analysis'
372 else if( flag == 3 )
then
373 write(*,*)
'###ERROR### : This element is not supported for this material'
375 write(*,*)
' ic_type = ', ic_type
376 if(
present(mtype) )
write(*,*)
' mtype = ', mtype
377 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
Shared predicates for finite-rotation nodal kinematics.
logical function, public fstr_uses_finite_rotation_kinematics(etype, nn, material)
Finite-rotation nodal kinematics for NLGEOM.
subroutine, public fstr_get_shell_trial_directors(fstrSOLID, thick, nn, nodLOCAL, directors)
Half-thickness director from the current Newton trial frame (dtriad).
subroutine, public fstr_ensure_finite_rotation_state(hecMESH, fstrSOLID, ndof)
Build the per-node reference frames once, by averaging element shell triads at shared nodes....
subroutine, public fstr_get_shell_reference_directors(fstrSOLID, thick, nn, nodLOCAL, directors)
Half-thickness director from the fixed reference frame (ref_triad).
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 kel361up
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.