15 logical,
private :: is_cutback_active = .false.
25 type(hecmwst_local_mesh) :: hecMESH
29 integer(kind=kint) :: istep, i, j
30 integer(kind=kint) :: ng
31 integer(kind=kint) :: nthick
32 integer(kind=kint) :: ncont, nstate
34 do istep=1,fstrsolid%nstep_tot
35 if( fstrsolid%step_ctrl(istep)%inc_type == stepautoinc ) is_cutback_active = .true.
38 if( .not. is_cutback_active )
return
42 allocate(fstrsolid%unode_bkup(
size(fstrsolid%unode)))
43 allocate(fstrsolid%QFORCE_bkup(
size(fstrsolid%QFORCE)))
44 if(
associated(fstrsolid%shell_triad) )
allocate(fstrsolid%shell_triad_bkup(
size(fstrsolid%shell_triad)))
45 if(
associated(fstrsolid%shell_drill) )
allocate(fstrsolid%shell_drill_bkup(
size(fstrsolid%shell_drill)))
46 if( fstrsolid%TEMP_ngrp_tot > 0 .or. fstrsolid%TEMP_irres > 0 )
then
47 allocate(fstrsolid%last_temp_bkup(
size(fstrsolid%last_temp)))
51 allocate(fstrsolid%elements_bkup(
size(fstrsolid%elements)))
52 do i=1,
size(fstrsolid%elements)
53 if (hecmw_is_etype_link( fstrsolid%elements(i)%etype )) cycle
54 if (hecmw_is_etype_patch( fstrsolid%elements(i)%etype )) cycle
56 allocate( fstrsolid%elements_bkup(i)%gausses(ng) )
58 fstrsolid%elements_bkup(i)%gausses(j)%pMaterial => fstrsolid%elements(i)%gausses(j)%pMaterial
63 fstrsolid%elements(i)%shell_nlayer, nthick )
64 if(
associated( fstrsolid%elements(i)%aux ) )
then
65 allocate( fstrsolid%elements_bkup(i)%aux(3,3) )
70 ncont = fstrsolid%n_contacts
71 if(
associated(fstrsolid%contacts) )
then
72 allocate(fstrsolid%contacts_bkup(ncont))
74 nstate =
size(fstrsolid%contacts(i)%states)
75 allocate(fstrsolid%contacts_bkup(i)%states(nstate))
80 ncont = fstrsolid%n_embeds
81 if(
associated(fstrsolid%embeds) )
then
82 allocate(fstrsolid%embeds_bkup(ncont))
84 nstate =
size(fstrsolid%embeds(i)%states)
85 allocate(fstrsolid%embeds_bkup(i)%states(nstate))
95 integer(kind=kint) :: i, j
96 integer(kind=kint) :: ng
97 integer(kind=kint) :: ncont
99 if( .not. is_cutback_active )
return
103 if(
associated(fstrsolid%unode_bkup) )
deallocate(fstrsolid%unode_bkup)
104 if(
associated(fstrsolid%QFORCE_bkup) )
deallocate(fstrsolid%QFORCE_bkup)
105 if(
associated(fstrsolid%shell_triad_bkup) )
deallocate(fstrsolid%shell_triad_bkup)
106 if(
associated(fstrsolid%shell_drill_bkup) )
deallocate(fstrsolid%shell_drill_bkup)
107 if( fstrsolid%TEMP_ngrp_tot > 0 .or. fstrsolid%TEMP_irres > 0 )
then
108 if(
associated(fstrsolid%last_temp_bkup) )
deallocate(fstrsolid%last_temp_bkup)
112 do i=1,
size(fstrsolid%elements)
113 if (hecmw_is_etype_link( fstrsolid%elements(i)%etype )) cycle
114 if (hecmw_is_etype_patch( fstrsolid%elements(i)%etype )) cycle
119 deallocate( fstrsolid%elements_bkup(i)%gausses )
121 if(
associated( fstrsolid%elements_bkup(i)%aux ) )
then
122 deallocate( fstrsolid%elements_bkup(i)%aux )
125 deallocate(fstrsolid%elements_bkup)
128 ncont = fstrsolid%n_contacts
129 if(
associated(fstrsolid%contacts) )
then
131 deallocate(fstrsolid%contacts_bkup(i)%states)
133 deallocate(fstrsolid%contacts_bkup)
137 ncont = fstrsolid%n_embeds
138 if(
associated(fstrsolid%embeds) )
then
140 deallocate(fstrsolid%embeds_bkup(i)%states)
142 deallocate(fstrsolid%embeds_bkup)
154 integer(kind=kint) :: i, j
155 integer(kind=kint) :: ng
156 integer(kind=kint) :: ncont, nstate
158 if( .not. is_cutback_active )
return
161 do i=1,
size(fstrsolid%unode)
162 fstrsolid%unode_bkup(i) = fstrsolid%unode(i)
164 do i=1,
size(fstrsolid%QFORCE)
165 fstrsolid%QFORCE_bkup(i) = fstrsolid%QFORCE(i)
167 if(
associated(fstrsolid%shell_triad_bkup) )
then
168 do i=1,
size(fstrsolid%shell_triad)
169 fstrsolid%shell_triad_bkup(i) = fstrsolid%shell_triad(i)
172 if(
associated(fstrsolid%shell_drill_bkup) )
then
173 do i=1,
size(fstrsolid%shell_drill)
174 fstrsolid%shell_drill_bkup(i) = fstrsolid%shell_drill(i)
177 if( fstrsolid%TEMP_ngrp_tot > 0 .or. fstrsolid%TEMP_irres > 0 )
then
178 do i=1,
size(fstrsolid%last_temp)
179 fstrsolid%last_temp_bkup(i) = fstrsolid%last_temp(i)
184 do i=1,
size(fstrsolid%elements)
185 if (hecmw_is_etype_link( fstrsolid%elements(i)%etype )) cycle
186 if (hecmw_is_etype_patch( fstrsolid%elements(i)%etype )) cycle
189 call fstr_copy_gauss( fstrsolid%elements(i)%gausses(j), fstrsolid%elements_bkup(i)%gausses(j) )
192 if(
associated( fstrsolid%elements(i)%aux ) )
then
193 fstrsolid%elements_bkup(i)%aux(:,:) = fstrsolid%elements(i)%aux(:,:)
198 ncont = fstrsolid%n_contacts
199 if(
associated(fstrsolid%contacts) )
then
201 nstate =
size(fstrsolid%contacts(i)%states)
203 call contact_state_copy(fstrsolid%contacts(i)%states(j), fstrsolid%contacts_bkup(i)%states(j))
206 infoctchange_bak = infoctchange
210 ncont = fstrsolid%n_embeds
211 if(
associated(fstrsolid%embeds) )
then
213 nstate =
size(fstrsolid%embeds(i)%states)
215 call contact_state_copy(fstrsolid%embeds(i)%states(j), fstrsolid%embeds_bkup(i)%states(j))
218 infoctchange_bak = infoctchange
228 integer(kind=kint) :: i, j
229 integer(kind=kint) :: ng
230 integer(kind=kint) :: ncont, nstate
232 if( .not. is_cutback_active )
return
235 do i=1,
size(fstrsolid%unode)
236 fstrsolid%unode(i) = fstrsolid%unode_bkup(i)
238 do i=1,
size(fstrsolid%QFORCE)
239 fstrsolid%QFORCE(i) = fstrsolid%QFORCE_bkup(i)
241 if(
associated(fstrsolid%shell_triad_bkup) )
then
242 do i=1,
size(fstrsolid%shell_triad)
243 fstrsolid%shell_triad(i) = fstrsolid%shell_triad_bkup(i)
244 fstrsolid%shell_dtriad(i) = fstrsolid%shell_triad_bkup(i)
247 if(
associated(fstrsolid%shell_drill_bkup) )
then
248 do i=1,
size(fstrsolid%shell_drill)
249 fstrsolid%shell_drill(i) = fstrsolid%shell_drill_bkup(i)
250 fstrsolid%shell_ddrill(i) = fstrsolid%shell_drill_bkup(i)
253 if( fstrsolid%TEMP_ngrp_tot > 0 .or. fstrsolid%TEMP_irres > 0 )
then
254 do i=1,
size(fstrsolid%last_temp)
255 fstrsolid%last_temp(i) = fstrsolid%last_temp_bkup(i)
260 do i=1,
size(fstrsolid%elements)
261 if (hecmw_is_etype_link( fstrsolid%elements(i)%etype )) cycle
262 if (hecmw_is_etype_patch( fstrsolid%elements(i)%etype )) cycle
265 call fstr_copy_gauss( fstrsolid%elements_bkup(i)%gausses(j), fstrsolid%elements(i)%gausses(j) )
268 if(
associated( fstrsolid%elements(i)%aux ) )
then
269 fstrsolid%elements(i)%aux(:,:) = fstrsolid%elements_bkup(i)%aux(:,:)
274 ncont = fstrsolid%n_contacts
275 if(
associated(fstrsolid%contacts) )
then
277 nstate =
size(fstrsolid%contacts(i)%states)
279 call contact_state_copy(fstrsolid%contacts_bkup(i)%states(j), fstrsolid%contacts(i)%states(j))
282 infoctchange = infoctchange_bak
286 ncont = fstrsolid%n_embeds
287 if(
associated(fstrsolid%embeds) )
then
289 nstate =
size(fstrsolid%embeds(i)%states)
291 call contact_state_copy(fstrsolid%embeds_bkup(i)%states(j), fstrsolid%embeds(i)%states(j))
294 infoctchange = infoctchange_bak
This module encapsulate the basic functions of all elements provide by this software.
integer function numofquadpoints(fetype)
Obtains the number of quadrature points of the element.
This module provides functions to deal with cutback.
subroutine fstr_cutback_save(fstrSOLID, infoCTChange, infoCTChange_bak)
Save analysis status.
subroutine fstr_cutback_load(fstrSOLID, infoCTChange, infoCTChange_bak)
Load analysis status.
subroutine fstr_cutback_init(hecMESH, fstrSOLID, fstrPARAM)
Initializer of cutback variables.
subroutine fstr_cutback_finalize(fstrSOLID)
Finalizer of cutback variables.
logical function fstr_cutback_active()
This module defines common data and basic structures for analysis.
This modules defines a structure to record history dependent parameter in static analysis.
integer(kind=kint) function fstr_shell_num_thickness_points(etype)
Number of through-thickness quadrature points used by shell stiffness.
subroutine fstr_init_gauss(gauss)
Initializer.
subroutine fstr_init_shell_layer_gausses(element, ng, nlayer, nthick)
Allocate shell history for every surface Gauss point, layer, and thickness point.
subroutine fstr_finalize_gauss(gauss)
Finializer.
subroutine fstr_finalize_shell_layer_gausses(element)
Release shell layer/thickness history.
subroutine fstr_copy_gauss(gauss1, gauss2)
Copy.
subroutine fstr_copy_shell_layer_gausses(element1, element2)
Copy shell layer/thickness history.
FSTR INNER CONTROL PARAMETERS (fstrPARAM)