16 type(hecmwst_local_mesh),
intent(in) :: hecMESH
17 type(
telemact),
intent(in) :: elemact
18 integer(kind=kint),
intent(in) :: dumid, amp_id
19 type(telement),
pointer,
intent(inout) :: elements(:)
20 real(kind=kreal),
intent(in) :: ctime
22 real(kind=kreal) :: amp_val
23 integer(kind=kint) :: amp_state
27 call hecmw_get_amplitude_value(hecmesh%amp, amp_id, ctime, amp_val)
30 if( amp_val > 0.5d0 )
then
36 call set_elemact_flag( hecmesh, elemact, dumid, elements, amp_state, .false. )
40 type(hecmwst_local_mesh),
intent(in) :: hecMESH
42 integer(kind=kint),
intent(in) :: cstep
43 real(kind=kreal),
intent(in) :: ctime
45 integer(kind=kint) :: idum, amp_id, gid
46 real(kind=kreal) :: amp_val
47 integer(kind=kint) :: target_state
49 do idum = 1, fstrsolid%elemact%ELEMACT_egrp_tot
50 gid = fstrsolid%elemact%ELEMACT_egrp_GRPID(idum)
56 amp_id = fstrsolid%elemact%ELEMACT_egrp_amp(idum)
64 target_state = fstrsolid%elemact%ELEMACT_egrp_state(idum)
66 if( fstrsolid%elemact%ELEMACT_egrp_depends(idum) ==
kelactd_none )
then
67 call set_elemact_flag( hecmesh, fstrsolid%elemact, idum, fstrsolid%elements, target_state, .false. )
69 call set_elemact_flag( hecmesh, fstrsolid%elemact, idum, fstrsolid%elements, target_state, .true. )
76 type(hecmwst_local_mesh),
intent(in) :: hecMESH
78 integer(kind=kint),
intent(in) :: cstep
79 real(kind=kreal),
intent(in) :: ctime
81 integer(kind=kint) :: idum, amp_id, gid
82 integer(kind=kint) :: n_changed_local, n_changed_total
83 real(kind=kreal) :: amp_val
87 do idum = 1, fstrsolid%elemact%ELEMACT_egrp_tot
88 gid = fstrsolid%elemact%ELEMACT_egrp_GRPID(idum)
91 amp_id = fstrsolid%elemact%ELEMACT_egrp_amp(idum)
101 n_changed_total = n_changed_total + n_changed_local
104 fstrsolid%elemact%ELEMACT_n_changed = n_changed_total
106 if( hecmesh%my_rank == 0 .and. n_changed_total > 0 )
then
107 write(*,
'(a,i6,a)')
' *** ELEMACT: ', n_changed_total,
' element(s) changed state (ACTIVE -> INACTIVE)'
113 type(hecmwst_local_mesh),
intent(in) :: hecmesh
114 type(
telemact),
intent(in) :: elemact
115 real(kind=kreal),
intent(in) :: ctime
116 type(telement),
pointer,
intent(inout) :: elements(:)
118 integer(kind=kint) :: idum, amp_id
119 real(kind=kreal) :: amp_val
123 do idum = 1, elemact%ELEMACT_egrp_tot
124 amp_id = elemact%ELEMACT_egrp_amp(idum)
126 if( amp_id > 0 )
then
127 call hecmw_get_amplitude_value(hecmesh%amp, amp_id, ctime, amp_val)
128 if( amp_val < 1.d0 ) cycle
137 integer(kind=kint),
intent(in) :: ndof
138 type(hecmwst_local_mesh),
intent(in) :: hecMESH
139 type(
telemact),
intent(in) :: elemact
140 type(telement),
pointer,
intent(inout) :: elements(:)
141 real(kind=kreal),
pointer,
intent(in) :: vec_old(:)
142 real(kind=kreal),
pointer,
intent(inout) :: vec_new(:)
144 integer(kind=kint) :: icel, in0
145 integer(kind=kint) :: iS, iE, ic_type, nodlocal, i
146 real(kind=kreal),
pointer :: active(:)
148 allocate(active(hecmesh%n_node))
151 do itype = 1, hecmesh%n_elem_type
152 is = hecmesh%elem_type_index(itype-1) + 1
153 ie = hecmesh%elem_type_index(itype )
154 ic_type = hecmesh%elem_type_item(itype)
156 if (hecmw_is_etype_link(ic_type)) cycle
157 if(ic_type == 3414) cycle
161 in0 = hecmesh%elem_node_index(icel-1)
162 nn = hecmw_get_max_node(ic_type)
164 nodlocal = hecmesh%elem_node_item(in0+i)
165 active(nodlocal) = 1.d0
170 call hecmw_update_r(hecmesh,active,hecmesh%n_node,1)
172 do i = 1, hecmesh%n_node
173 if( active(i) > 0.d0 ) cycle
174 vec_new(ndof*(i-1)+1:ndof*i) = vec_old(ndof*(i-1)+1:ndof*i)
182 type(hecmwst_local_mesh),
intent(in) :: hecmesh
183 type(telement),
pointer,
intent(in) :: elements(:)
184 real(kind=kreal),
pointer,
intent(inout) :: outval(:)
186 integer(kind=kint) :: icel
189 do icel = 1, hecmesh%n_elem
190 if( elements(icel)%elemact_flag /=
kelact_inactive ) outval(icel) = 1.d0
196 type(hecmwst_local_mesh),
intent(in) :: hecMESH
197 type(
telemact),
intent(in) :: elemact
198 integer(kind=kint),
intent(in) :: dumid
199 type(telement),
pointer,
intent(inout) :: elements(:)
201 integer(kind=kint) :: ig, iS0, iE0, ik, icel
203 if( dumid < 0 .or. dumid > elemact%ELEMACT_egrp_tot )
return
205 ig = elemact%ELEMACT_egrp_ID(dumid)
206 is0 = hecmesh%elem_group%grp_index(ig-1) + 1
207 ie0 = hecmesh%elem_group%grp_index(ig )
210 icel = hecmesh%elem_group%grp_item(ik)
212 elements(icel)%elemact_coeff = elemact%ELEMACT_egrp_eps(dumid)
218 type(hecmwst_local_mesh),
intent(in) :: hecMESH
219 type(
telemact),
intent(in) :: elemact
220 integer(kind=kint),
intent(in) :: dumid
221 type(telement),
pointer,
intent(inout) :: elements(:)
222 integer(kind=kint),
intent(out) :: n_changed
224 integer(kind=kint) :: ig, iS0, iE0, ik, icel, dtype, ig0
225 integer(kind=kint) :: old_flag
226 real(kind=kreal) :: thlow, thup, stress(6), mises, ps
227 integer(kind=kint) :: target_state
230 if( dumid < 0 .or. dumid > elemact%ELEMACT_egrp_tot )
return
231 if( elemact%ELEMACT_egrp_depends(dumid) ==
kelactd_none )
return
233 ig = elemact%ELEMACT_egrp_ID(dumid)
234 is0 = hecmesh%elem_group%grp_index(ig-1) + 1
235 ie0 = hecmesh%elem_group%grp_index(ig )
237 thlow = elemact%ELEMACT_egrp_ts_lower(dumid)
238 thup = elemact%ELEMACT_egrp_ts_upper(dumid)
244 if (
associated(elemact%ELEMACT_egrp_state))
then
245 target_state = elemact%ELEMACT_egrp_state(dumid)
249 icel = hecmesh%elem_group%grp_item(ik)
255 elements(icel)%elemact_coeff = elemact%ELEMACT_egrp_eps(dumid)
265 do ig0=1,
size(elements(icel)%gausses)
268 stress(1:6) = elements(icel)%gausses(ig0)%stress(1:6)
269 elseif( elemact%ELEMACT_egrp_depends(dumid) ==
kelactd_strain )
then
270 stress(1:6) = elements(icel)%gausses(ig0)%strain(1:6)
274 ps = ( stress(1) + stress(2) + stress(3) ) / 3.0d0
275 mises = 0.5d0 * ( (stress(1)-ps)**2 + (stress(2)-ps)**2 + (stress(3)-ps)**2 )
276 mises = mises + stress(4)**2 + stress(5)**2 + stress(6)**2
277 mises = dsqrt( 3.0d0 * mises )
280 old_flag = elements(icel)%elemact_flag
281 if( .not. (thlow <= mises .and. mises <= thup) )
then
283 elements(icel)%elemact_coeff = elemact%ELEMACT_egrp_eps(dumid)
286 if( elements(icel)%elemact_flag /= old_flag ) n_changed = n_changed + 1
295 type(hecmwst_local_mesh),
intent(in) :: hecMESH
296 type(
telemact),
intent(in) :: elemact
297 integer(kind=kint),
intent(in) :: dumid
298 type(telement),
pointer,
intent(inout) :: elements(:)
299 integer(kind=kint),
intent(in) :: flag
300 logical,
intent(in) :: init_only
302 integer(kind=kint) :: ig, iS0, iE0, ik, icel
304 if( dumid < 0 .or. dumid > elemact%ELEMACT_egrp_tot )
return
306 ig = elemact%ELEMACT_egrp_ID(dumid)
307 is0 = hecmesh%elem_group%grp_index(ig-1) + 1
308 ie0 = hecmesh%elem_group%grp_index(ig )
311 icel = hecmesh%elem_group%grp_item(ik)
313 if( elements(icel)%elemact_flag ==
kelact_undefined ) elements(icel)%elemact_flag = flag
315 elements(icel)%elemact_flag = flag
317 elements(icel)%elemact_coeff = elemact%ELEMACT_egrp_eps(dumid)
323 type(hecmwst_local_mesh),
intent(in) :: hecMESH
324 type(
telemact),
intent(in) :: elemact
325 type(telement),
pointer,
intent(inout) :: elements(:)
327 integer(kind=kint) :: idum, ig, iS0, iE0, ik, icel
329 do idum = 1, elemact%ELEMACT_egrp_tot
330 ig = elemact%ELEMACT_egrp_GRPID(idum)
331 is0 = hecmesh%elem_group%grp_index(ig-1) + 1
332 ie0 = hecmesh%elem_group%grp_index(ig )
335 icel = hecmesh%elem_group%grp_item(ik)
This module defined elemact data and function.
integer, parameter kelactd_none
integer, parameter kelact_active
integer, parameter kelactd_stress
integer, parameter kelact_undefined
integer, parameter kelact_inactive
integer, parameter kelactd_strain
This module provide a function to elemact elements.
subroutine output_elemact_flag(hecMESH, elements, outval)
subroutine fstr_update_elemact_solid_by_value(hecMESH, fstrSOLID, cstep, ctime)
subroutine fstr_update_elemact_heat(hecMESH, elemact, ctime, elements)
subroutine set_elemact_flag(hecMESH, elemact, dumid, elements, flag, init_only)
subroutine activate_elemact_flag_by_value(hecMESH, elemact, dumid, elements, n_changed)
subroutine apply_amplitude_control(hecMESH, elemact, dumid, elements, amp_id, ctime)
Apply amplitude-based element activation control amp_val > 0.5: ACTIVE, amp_val <= 0....
subroutine activate_elemact_flag(hecMESH, elemact, dumid, elements)
subroutine fstr_updatedof_elemact(ndof, hecMESH, elemact, elements, vec_old, vec_new)
subroutine clear_elemact_flag_all(hecMESH, elemact, elements)
subroutine fstr_update_elemact_solid(hecMESH, fstrSOLID, cstep, ctime)
This module defines common data and basic structures for analysis.
logical function fstr_iselemactivationactive(fstrSOLID, nbc, cstep)