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
25 call hecmw_get_amplitude_value(hecmesh%amp, amp_id, ctime, amp_val)
28 if( amp_val > 0.5d0 )
then
34 call set_elemact_flag( hecmesh, elemact, dumid, elements, amp_state, .false. )
38 type(hecmwst_local_mesh),
intent(in) :: hecMESH
40 integer(kind=kint),
intent(in) :: cstep
41 real(kind=kreal),
intent(in) :: ctime
43 integer(kind=kint) :: idum, amp_id, gid
44 real(kind=kreal) :: amp_val
45 integer(kind=kint) :: target_state
47 do idum = 1, fstrsolid%elemact%ELEMACT_egrp_tot
48 gid = fstrsolid%elemact%ELEMACT_egrp_GRPID(idum)
54 amp_id = fstrsolid%elemact%ELEMACT_egrp_amp(idum)
62 target_state = fstrsolid%elemact%ELEMACT_egrp_state(idum)
64 if( fstrsolid%elemact%ELEMACT_egrp_depends(idum) ==
kelactd_none )
then
65 call set_elemact_flag( hecmesh, fstrsolid%elemact, idum, fstrsolid%elements, target_state, .false. )
67 call set_elemact_flag( hecmesh, fstrsolid%elemact, idum, fstrsolid%elements, target_state, .true. )
74 type(hecmwst_local_mesh),
intent(in) :: hecMESH
76 integer(kind=kint),
intent(in) :: cstep
77 real(kind=kreal),
intent(in) :: ctime
79 integer(kind=kint) :: idum, amp_id, gid
80 integer(kind=kint) :: n_changed_local, n_changed_total
81 real(kind=kreal) :: amp_val
85 do idum = 1, fstrsolid%elemact%ELEMACT_egrp_tot
86 gid = fstrsolid%elemact%ELEMACT_egrp_GRPID(idum)
89 amp_id = fstrsolid%elemact%ELEMACT_egrp_amp(idum)
99 n_changed_total = n_changed_total + n_changed_local
102 fstrsolid%elemact%ELEMACT_n_changed = n_changed_total
104 if( hecmesh%my_rank == 0 .and. n_changed_total > 0 )
then
105 write(*,
'(a,i6,a)')
' *** ELEMACT: ', n_changed_total,
' element(s) changed state (ACTIVE -> INACTIVE)'
111 type(hecmwst_local_mesh),
intent(in) :: hecmesh
112 type(
telemact),
intent(in) :: elemact
113 real(kind=kreal),
intent(in) :: ctime
114 type(telement),
pointer,
intent(inout) :: elements(:)
116 integer(kind=kint) :: idum, amp_id
117 real(kind=kreal) :: amp_val
121 do idum = 1, elemact%ELEMACT_egrp_tot
122 amp_id = elemact%ELEMACT_egrp_amp(idum)
124 if( amp_id > 0 )
then
125 call hecmw_get_amplitude_value(hecmesh%amp, amp_id, ctime, amp_val)
126 if( amp_val < 1.d0 ) cycle
135 integer(kind=kint),
intent(in) :: ndof
136 type(hecmwst_local_mesh),
intent(in) :: hecMESH
137 type(
telemact),
intent(in) :: elemact
138 type(telement),
pointer,
intent(inout) :: elements(:)
139 real(kind=kreal),
pointer,
intent(in) :: vec_old(:)
140 real(kind=kreal),
pointer,
intent(inout) :: vec_new(:)
142 integer(kind=kint) :: icel, in0
143 integer(kind=kint) :: iS, iE, ic_type, nodlocal, i
144 real(kind=kreal),
pointer :: active(:)
146 allocate(active(hecmesh%n_node))
149 do itype = 1, hecmesh%n_elem_type
150 is = hecmesh%elem_type_index(itype-1) + 1
151 ie = hecmesh%elem_type_index(itype )
152 ic_type = hecmesh%elem_type_item(itype)
154 if (hecmw_is_etype_link(ic_type)) cycle
155 if(ic_type == 3414) cycle
159 in0 = hecmesh%elem_node_index(icel-1)
160 nn = hecmw_get_max_node(ic_type)
162 nodlocal = hecmesh%elem_node_item(in0+i)
163 active(nodlocal) = 1.d0
168 call hecmw_update_r(hecmesh,active,hecmesh%n_node,1)
170 do i = 1, hecmesh%n_node
171 if( active(i) > 0.d0 ) cycle
172 vec_new(ndof*(i-1)+1:ndof*i) = vec_old(ndof*(i-1)+1:ndof*i)
180 type(hecmwst_local_mesh),
intent(in) :: hecmesh
181 type(telement),
pointer,
intent(in) :: elements(:)
182 real(kind=kreal),
pointer,
intent(inout) :: outval(:)
184 integer(kind=kint) :: icel
187 do icel = 1, hecmesh%n_elem
188 if( elements(icel)%elemact_flag ==
kelact_inactive ) outval(icel) = 1.d0
194 type(hecmwst_local_mesh),
intent(in) :: hecMESH
195 type(
telemact),
intent(in) :: elemact
196 integer(kind=kint),
intent(in) :: dumid
197 type(telement),
pointer,
intent(inout) :: elements(:)
199 integer(kind=kint) :: ig, iS0, iE0, ik, icel
201 if( dumid < 0 .or. dumid > elemact%ELEMACT_egrp_tot )
return
203 ig = elemact%ELEMACT_egrp_ID(dumid)
204 is0 = hecmesh%elem_group%grp_index(ig-1) + 1
205 ie0 = hecmesh%elem_group%grp_index(ig )
208 icel = hecmesh%elem_group%grp_item(ik)
210 elements(icel)%elemact_coeff = elemact%ELEMACT_egrp_eps(dumid)
216 type(hecmwst_local_mesh),
intent(in) :: hecMESH
217 type(
telemact),
intent(in) :: elemact
218 integer(kind=kint),
intent(in) :: dumid
219 type(telement),
pointer,
intent(inout) :: elements(:)
220 integer(kind=kint),
intent(out) :: n_changed
222 integer(kind=kint) :: ig, iS0, iE0, ik, icel, dtype, ig0
223 integer(kind=kint) :: old_flag
224 real(kind=kreal) :: thlow, thup, stress(6), mises, ps
225 integer(kind=kint) :: target_state
228 if( dumid < 0 .or. dumid > elemact%ELEMACT_egrp_tot )
return
229 if( elemact%ELEMACT_egrp_depends(dumid) ==
kelactd_none )
return
231 ig = elemact%ELEMACT_egrp_ID(dumid)
232 is0 = hecmesh%elem_group%grp_index(ig-1) + 1
233 ie0 = hecmesh%elem_group%grp_index(ig )
235 thlow = elemact%ELEMACT_egrp_ts_lower(dumid)
236 thup = elemact%ELEMACT_egrp_ts_upper(dumid)
242 if (
associated(elemact%ELEMACT_egrp_state))
then
243 target_state = elemact%ELEMACT_egrp_state(dumid)
247 icel = hecmesh%elem_group%grp_item(ik)
253 elements(icel)%elemact_coeff = elemact%ELEMACT_egrp_eps(dumid)
263 do ig0=1,
size(elements(icel)%gausses)
266 stress(1:6) = elements(icel)%gausses(ig0)%stress(1:6)
267 elseif( elemact%ELEMACT_egrp_depends(dumid) ==
kelactd_strain )
then
268 stress(1:6) = elements(icel)%gausses(ig0)%strain(1:6)
272 ps = ( stress(1) + stress(2) + stress(3) ) / 3.0d0
273 mises = 0.5d0 * ( (stress(1)-ps)**2 + (stress(2)-ps)**2 + (stress(3)-ps)**2 )
274 mises = mises + stress(4)**2 + stress(5)**2 + stress(6)**2
275 mises = dsqrt( 3.0d0 * mises )
278 old_flag = elements(icel)%elemact_flag
279 if( .not. (thlow <= mises .and. mises <= thup) )
then
281 elements(icel)%elemact_coeff = elemact%ELEMACT_egrp_eps(dumid)
284 if( elements(icel)%elemact_flag /= old_flag ) n_changed = n_changed + 1
293 type(hecmwst_local_mesh),
intent(in) :: hecMESH
294 type(
telemact),
intent(in) :: elemact
295 integer(kind=kint),
intent(in) :: dumid
296 type(telement),
pointer,
intent(inout) :: elements(:)
297 integer(kind=kint),
intent(in) :: flag
298 logical,
intent(in) :: init_only
300 integer(kind=kint) :: ig, iS0, iE0, ik, icel
302 if( dumid < 0 .or. dumid > elemact%ELEMACT_egrp_tot )
return
304 ig = elemact%ELEMACT_egrp_ID(dumid)
305 is0 = hecmesh%elem_group%grp_index(ig-1) + 1
306 ie0 = hecmesh%elem_group%grp_index(ig )
309 icel = hecmesh%elem_group%grp_item(ik)
311 if( elements(icel)%elemact_flag ==
kelact_undefined ) elements(icel)%elemact_flag = flag
313 elements(icel)%elemact_flag = flag
315 elements(icel)%elemact_coeff = elemact%ELEMACT_egrp_eps(dumid)
321 type(hecmwst_local_mesh),
intent(in) :: hecMESH
322 type(
telemact),
intent(in) :: elemact
323 type(telement),
pointer,
intent(inout) :: elements(:)
325 integer(kind=kint) :: idum, ig, iS0, iE0, ik, icel
327 do idum = 1, elemact%ELEMACT_egrp_tot
328 ig = elemact%ELEMACT_egrp_GRPID(idum)
329 is0 = hecmesh%elem_group%grp_index(ig-1) + 1
330 ie0 = hecmesh%elem_group%grp_index(ig )
333 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)