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 print_elemact_info( elact )
41  type(telemact), intent(in) :: elact
42 
43  integer(kind=kint) :: i
44 
45  write(*,'(A,I0)') 'ELEMACT_egrp_tot: ', elact%ELEMACT_egrp_tot
46  do i=1,elact%ELEMACT_egrp_tot
47  write(*,*) 'DUMMY : ',i
48  write(*,*) 'GRPID : ',elact%ELEMACT_egrp_GRPID
49  write(*,*) 'EGRPID : ',elact%ELEMACT_egrp_ID
50  write(*,*) 'AMPLITUDE: ',elact%ELEMACT_egrp_amp
51  write(*,*) 'EPSILON : ',elact%ELEMACT_egrp_eps
52  write(*,*) 'DEPENDS : ',elact%ELEMACT_egrp_depends
53  write(*,*) 'THLOWER : ',elact%ELEMACT_egrp_ts_lower
54  write(*,*) 'THUPPER : ',elact%ELEMACT_egrp_ts_upper
55  end do
56  end subroutine
57 
58 
59  subroutine stf_dummy( ndof, nn, ecoord, u, stiff, element )
60  use mmechgauss
61  integer(kind=kint), intent(in) :: ndof
62  integer(kind=kint), intent(in) :: nn
63  real(kind=kreal), intent(in) :: ecoord(3,nn)
64  real(kind=kreal), intent(in) :: u(3,nn)
65  type(telement), intent(inout) :: element
66  real(kind=kreal), intent(out) :: stiff(:,:)
67 
68  integer(kind=kint) :: i,j,k,m,n
69  real(kind=kreal) :: dnn, coeff, xmax(3), xmin(3), dl
70 
71  !get average element size
72  xmax(1:3) = ecoord(1:3,1)
73  xmin(1:3) = ecoord(1:3,1)
74  do i=2,nn
75  do k=1,ndof
76  if( ecoord(k,i) > xmax(k) ) xmax(k) = ecoord(k,i)
77  if( ecoord(k,i) < xmin(k) ) xmin(k) = ecoord(k,i)
78  end do
79  end do
80  dl = 0.33333333333d0*((xmax(1)-xmin(1))+(xmax(2)-xmin(2))+(xmax(3)-xmin(3)))
81  if( dl < 1.d-8 ) dl = 1.d0
82 
83  coeff = element%elemact_coeff/dl
84  dnn = 1.d0/dble(nn)
85  stiff(:,:) = 0.d0
86  do i=1,nn
87  m = ndof*(i-1)
88 
89  do j=1,nn
90  n = ndof*(j-1)
91  do k=1,ndof
92  stiff(m+k,n+k) = stiff(m+k,n+k)-coeff*dnn
93  end do
94  end do
95 
96  do k=1,ndof
97  stiff(m+k,m+k) = stiff(m+k,m+k)+coeff
98  end do
99  end do
100 
101  end subroutine
102 
103 
104  subroutine update_dummy( ndof, nn, ecoord, u, du, qf, element )
105  use mmechgauss
106  integer(kind=kint), intent(in) :: ndof
107  integer(kind=kint), intent(in) :: nn
108  real(kind=kreal), intent(in) :: ecoord(3,nn)
109  real(kind=kreal), intent(in) :: u(3,nn)
110  real(kind=kreal), intent(in) :: du(3,nn)
111  type(telement), intent(inout) :: element
112  real(kind=kreal), intent(out) :: qf(:)
113 
114  integer(kind=kint) :: i,k,m
115  real(kind=kreal) :: dnn, coeff, aveu(3), xmax(3), xmin(3), dl
116 
117  !get average element size
118  xmax(1:3) = ecoord(1:3,1)
119  xmin(1:3) = ecoord(1:3,1)
120  do i=2,nn
121  do k=1,ndof
122  if( ecoord(k,i) > xmax(k) ) xmax(k) = ecoord(k,i)
123  if( ecoord(k,i) < xmin(k) ) xmin(k) = ecoord(k,i)
124  end do
125  end do
126  dl = 0.33333333333d0*((xmax(1)-xmin(1))+(xmax(2)-xmin(2))+(xmax(3)-xmin(3)))
127  if( dl < 1.d-8 ) dl = 1.d0
128 
129  coeff = element%elemact_coeff/dl
130  dnn = 1.d0/dble(nn)
131  aveu(:) = 0.d0
132  do i=1,nn
133  do k=1,ndof
134  aveu(k) = aveu(k) + u(k,i) + du(k,i)
135  end do
136  end do
137  aveu(:) = aveu(:)*dnn
138 
139  qf(:) = 0.d0
140  do i=1,nn
141  m = ndof*(i-1)
142 
143  do k=1,ndof
144  qf(m+k) = coeff*(u(k,i)+du(k,i)-aveu(k))
145  end do
146  end do
147 
148  do i=1,size(element%gausses)
149  element%gausses(i)%strain = 0.d0
150  element%gausses(i)%stress = 0.d0
151  element%gausses(i)%strain_out = 0.d0
152  element%gausses(i)%stress_out = 0.d0
153  if( associated(element%gausses(i)%istatus) ) element%gausses(i)%istatus = 0
154  if( associated(element%gausses(i)%fstatus) ) element%gausses(i)%fstatus = 0.d0
155  end do
156 
157  end subroutine
158 
159 
160 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 print_elemact_info(elact)
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:32