FrontISTR  5.9.0
Large-scale structural analysis program with finit element method
m_element_activation.f90
Go to the documentation of this file.
1 !-------------------------------------------------------------------------------
2 ! Copyright (c) 2016 The University of Tokyo
3 ! This software is released under the MIT License, see LICENSE.txt
4 !-------------------------------------------------------------------------------
6 module m_elemact
7  use hecmw
8  use mmechgauss
9 
10  implicit none
11 
12  type telemact
14  integer(kind=kint) :: elemact_egrp_tot
15  integer(kind=kint), pointer :: elemact_egrp_grpid (:) =>null()
16  integer(kind=kint), pointer :: elemact_egrp_id (:) =>null()
17  integer(kind=kint), pointer :: elemact_egrp_amp (:) =>null()
18  real(kind=kreal), pointer :: elemact_egrp_eps(:) =>null()
19  integer(kind=kint), pointer :: elemact_egrp_depends(:) =>null()
20  real(kind=kreal), pointer :: elemact_egrp_ts_lower(:) =>null()
21  real(kind=kreal), pointer :: elemact_egrp_ts_upper(:) =>null()
22  integer(kind=kint), pointer :: elemact_egrp_state (:) =>null() ! Element activation state
23  integer(kind=kint) :: elemact_n_changed = 0 ! Number of elements that changed state in last update
24  logical :: elemact_conv_deferred = .false. ! True if convergence was deferred due to state change (once per substep)
25  end type
26 
27  ! Element status flags
28  integer, parameter :: kelact_undefined = -1 ! Undefined state
29  integer, parameter :: kelact_active = 0 ! Element is active in calculation
30  integer, parameter :: kelact_inactive = 1 ! Element is inactive (deactivated) in calculation
31 
32  ! Dependency type flags
33  integer, parameter :: kelactd_none = 1 ! No dependencies
34  integer, parameter :: kelactd_stress = 2 ! Stress dependent
35  integer, parameter :: kelactd_strain = 3 ! Strain dependent
36 
37 contains
38 
39 
40  subroutine stf_dummy( ndof, nn, ecoord, u, stiff, element )
41  use mmechgauss
42  integer(kind=kint), intent(in) :: ndof
43  integer(kind=kint), intent(in) :: nn
44  real(kind=kreal), intent(in) :: ecoord(3,nn)
45  real(kind=kreal), intent(in) :: u(3,nn)
46  type(telement), intent(inout) :: element
47  real(kind=kreal), intent(out) :: stiff(:,:)
48 
49  integer(kind=kint) :: i,j,k,m,n
50  real(kind=kreal) :: dnn, coeff, xmax(3), xmin(3), dl
51 
52  !get average element size
53  xmax(1:3) = ecoord(1:3,1)
54  xmin(1:3) = ecoord(1:3,1)
55  do i=2,nn
56  do k=1,ndof
57  if( ecoord(k,i) > xmax(k) ) xmax(k) = ecoord(k,i)
58  if( ecoord(k,i) < xmin(k) ) xmin(k) = ecoord(k,i)
59  end do
60  end do
61  dl = 0.33333333333d0*((xmax(1)-xmin(1))+(xmax(2)-xmin(2))+(xmax(3)-xmin(3)))
62  if( dl < 1.d-8 ) dl = 1.d0
63 
64  coeff = element%elemact_coeff/dl
65  dnn = 1.d0/dble(nn)
66  stiff(:,:) = 0.d0
67  do i=1,nn
68  m = ndof*(i-1)
69 
70  do j=1,nn
71  n = ndof*(j-1)
72  do k=1,ndof
73  stiff(m+k,n+k) = stiff(m+k,n+k)-coeff*dnn
74  end do
75  end do
76 
77  do k=1,ndof
78  stiff(m+k,m+k) = stiff(m+k,m+k)+coeff
79  end do
80  end do
81 
82  end subroutine
83 
84 
85  subroutine update_dummy( ndof, nn, ecoord, u, du, qf, element )
86  use mmechgauss
87  integer(kind=kint), intent(in) :: ndof
88  integer(kind=kint), intent(in) :: nn
89  real(kind=kreal), intent(in) :: ecoord(3,nn)
90  real(kind=kreal), intent(in) :: u(3,nn)
91  real(kind=kreal), intent(in) :: du(3,nn)
92  type(telement), intent(inout) :: element
93  real(kind=kreal), intent(out) :: qf(:)
94 
95  integer(kind=kint) :: i,k,m
96  real(kind=kreal) :: dnn, coeff, aveu(3), xmax(3), xmin(3), dl
97 
98  !get average element size
99  xmax(1:3) = ecoord(1:3,1)
100  xmin(1:3) = ecoord(1:3,1)
101  do i=2,nn
102  do k=1,ndof
103  if( ecoord(k,i) > xmax(k) ) xmax(k) = ecoord(k,i)
104  if( ecoord(k,i) < xmin(k) ) xmin(k) = ecoord(k,i)
105  end do
106  end do
107  dl = 0.33333333333d0*((xmax(1)-xmin(1))+(xmax(2)-xmin(2))+(xmax(3)-xmin(3)))
108  if( dl < 1.d-8 ) dl = 1.d0
109 
110  coeff = element%elemact_coeff/dl
111  dnn = 1.d0/dble(nn)
112  aveu(:) = 0.d0
113  do i=1,nn
114  do k=1,ndof
115  aveu(k) = aveu(k) + u(k,i) + du(k,i)
116  end do
117  end do
118  aveu(:) = aveu(:)*dnn
119 
120  qf(:) = 0.d0
121  do i=1,nn
122  m = ndof*(i-1)
123 
124  do k=1,ndof
125  qf(m+k) = coeff*(u(k,i)+du(k,i)-aveu(k))
126  end do
127  end do
128 
129  do i=1,size(element%gausses)
130  element%gausses(i)%strain = 0.d0
131  element%gausses(i)%stress = 0.d0
132  element%gausses(i)%strain_out = 0.d0
133  element%gausses(i)%stress_out = 0.d0
134  if( associated(element%gausses(i)%istatus) ) element%gausses(i)%istatus = 0
135  if( associated(element%gausses(i)%fstatus) ) element%gausses(i)%fstatus = 0.d0
136  end do
137 
138  end subroutine
139 
140 
141 end module m_elemact
Definition: hecmw.f90:6
This module defined elemact data and function.
integer, parameter kelactd_none
integer, parameter kelact_active
subroutine update_dummy(ndof, nn, ecoord, u, du, qf, element)
integer, parameter kelactd_stress
integer, parameter kelact_undefined
integer, parameter kelact_inactive
integer, parameter kelactd_strain
subroutine stf_dummy(ndof, nn, ecoord, u, stiff, element)
This modules defines a structure to record history dependent parameter in static analysis.
Definition: mechgauss.f90:6
All data should be recorded in every elements.
Definition: mechgauss.f90:34