Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/fem/tests/BlockPoisson3/BlockPoissonAssembly.f90
3206 views
1
2
!------------------------------------------------------------------------------
3
SUBROUTINE BulkAssembly( Model,Solver,dt,Transient, &
4
Mass, Damp, Stiff, Force, InElement, nrow, ncol )
5
!------------------------------------------------------------------------------
6
7
USE DefUtils
8
9
10
IMPLICIT NONE
11
!------------------------------------------------------------------------------
12
TYPE(Model_t) :: Model
13
TYPE(Solver_t), TARGET :: Solver
14
LOGICAL :: Transient
15
REAL(KIND=dp) :: dt
16
REAL(KIND=dp) :: Stiff(:,:), Damp(:,:), Mass(:,:), Force(:)
17
TYPE(Element_t), TARGET :: InElement
18
INTEGER :: Nrow, Ncol
19
!------------------------------------------------------------------------------
20
! Local variables
21
!------------------------------------------------------------------------------
22
23
TYPE(GaussIntegrationPoints_t), TARGET :: IntegStuff
24
TYPE(Nodes_t) :: Nodes
25
REAL(KIND=dp), ALLOCATABLE :: Source(:), Cond(:), React(:)
26
REAL(KIND=dp), ALLOCATABLE :: Basis(:), dBasisdx(:,:)
27
REAL(KIND=dp) :: SourceAtIP, CondAtIP, ReactAtIp, Weight, DetJ
28
INTEGER :: i,j,t,p,q,n
29
LOGICAL :: Visited = .FALSE., Found
30
TYPE(Element_t), POINTER :: Element
31
TYPE(ValueList_t), POINTER :: Material, Params
32
CHARACTER(LEN=MAX_NAME_LEN) :: str
33
34
35
36
SAVE Visited, Source, Cond, React, Nodes, Basis, dBasisdx, Params
37
38
39
IF( .NOT. Visited ) THEN
40
N = Solver % Mesh % MaxElementNodes
41
ALLOCATE( Source(n), Cond(n), React(n), Basis(n), dBasisdx(n,3), &
42
Nodes % x(n), Nodes % y(n), Nodes % z(n) )
43
CALL info('PoissonBulkAssembly','1st time')
44
Params => CurrentModel % Solver % Values
45
Visited = .TRUE.
46
END IF
47
48
n = Nrow
49
CALL GetElementNodes( Nodes )
50
Material => GetMaterial()
51
52
i = ListGetInteger( Params,'Block Matrix Row')
53
j = ListGetInteger( Params,'Block Matrix Column')
54
55
WRITE (str,'(A,I1,I1)') 'Conductivity ',i,j
56
Cond(1:n) = GetReal( Material,str,Found)
57
58
WRITE (str,'(A,I1,I1)') 'Reaction ',i,j
59
React(1:n) = GetReal( Material,str,Found )
60
61
IF( i == j ) THEN
62
WRITE (str,'(A,I1)') 'Source ',i
63
Source(1:n) = GetReal( Material,str,Found)
64
ELSE
65
Source(1:n) = 0.0_dp
66
END IF
67
68
IF( .FALSE. ) THEN
69
PRINT *,'ij:',i,j
70
PRINT *,'coeffs:',Cond(1),React(1),Source(1)
71
END IF
72
73
74
75
Element => GetCurrentElement()
76
IntegStuff = GaussPoints( Element )
77
78
DO t=1,IntegStuff % n
79
80
Found = ElementInfo( Element, Nodes, IntegStuff % u(t), &
81
IntegStuff % v(t), IntegStuff % w(t), detJ, Basis, dBasisdx )
82
83
Weight = IntegStuff % s(t) * detJ
84
85
CondAtIP = SUM( Basis(1:Nrow) * Cond(1:Nrow) )
86
SourceAtIP = SUM( Basis(1:Nrow) * Source(1:Nrow) )
87
ReactAtIP = SUM( Basis(1:Nrow) * React(1:Nrow) )
88
89
DO p=1,n
90
DO q=1,n
91
STIFF(p,q) = STIFF(p,q) + Weight * CondAtIP * &
92
SUM(dBasisdx(p,1:3)*dBasisdx(q,1:3))
93
STIFF(p,q) = STIFF(p,q) + Weight * ReactAtIP * &
94
Basis(p)*Basis(q)
95
END DO
96
FORCE(p) = FORCE(p) + Weight * SourceAtIP * Basis(p)
97
END DO
98
END DO
99
100
!------------------------------------------------------------------------------
101
END SUBROUTINE BulkAssembly
102
!------------------------------------------------------------------------------
103
104
105
106
!------------------------------------------------------------------------------
107
SUBROUTINE BoundaryAssembly( Model,Solver,dt,Transient, &
108
Mass, Damp, Stiff, Force, InElement, nrow, ncol )
109
!------------------------------------------------------------------------------
110
111
USE DefUtils
112
113
IMPLICIT NONE
114
!------------------------------------------------------------------------------
115
TYPE(Model_t) :: Model
116
TYPE(Solver_t), TARGET :: Solver
117
LOGICAL :: Transient
118
REAL(KIND=dp) :: dt
119
REAL(KIND=dp) :: Stiff(:,:), Damp(:,:), Mass(:,:), Force(:)
120
TYPE(Element_t), TARGET :: InElement
121
INTEGER :: Nrow, Ncol
122
!------------------------------------------------------------------------------
123
! Local variables
124
!------------------------------------------------------------------------------
125
126
TYPE(GaussIntegrationPoints_t), TARGET :: IntegStuff
127
TYPE(Nodes_t) :: Nodes
128
REAL(KIND=dp), ALLOCATABLE :: Flux(:), Text(:), Coeff(:)
129
REAL(KIND=dp), ALLOCATABLE :: Basis(:), dBasisdx(:,:)
130
REAL(KIND=dp) :: FluxAtIP, TextAtIP, CoeffAtIP, Weight, DetJ
131
INTEGER :: i,j,t,p,q,n
132
LOGICAL :: Visited = .FALSE., Found, Found2
133
TYPE(ValueList_t), POINTER :: BC
134
TYPE(Element_t), POINTER :: Element
135
136
137
SAVE Visited, Flux, Text, Coeff, Nodes, Basis, dBasisdx
138
139
140
IF( .NOT. Visited ) THEN
141
N = Solver % Mesh % MaxElementNodes
142
ALLOCATE( Flux(n), Text(n), Coeff(n), Basis(n), dBasisdx(n,3), &
143
Nodes % x(n), Nodes % y(n), Nodes % z(n) )
144
CALL info('PoissonBoundaryAssembly','1st time')
145
Visited = .TRUE.
146
END IF
147
148
Element => GetCurrentElement()
149
n = Nrow
150
CALL GetElementNodes( Nodes )
151
152
BC => GetBC( )
153
154
Flux(1:n) = GetReal( BC,'Flux',Found )
155
Coeff(1:n) = GetReal( BC,'Coefficient',Found2 )
156
IF(.NOT. (Found .OR. Found2)) RETURN
157
Text(1:n) = GetReal( BC,'External',Found )
158
159
160
IntegStuff = GaussPoints( Element )
161
162
DO t=1,IntegStuff % n
163
164
Found = ElementInfo( Element, Nodes, IntegStuff % u(t), &
165
IntegStuff % v(t), IntegStuff % w(t), detJ, Basis, dBasisdx )
166
167
Weight = IntegStuff % s(t) * detJ
168
169
FluxAtIP = SUM( Basis(1:Nrow) * Flux(1:Nrow) )
170
CoeffAtIP = SUM( Basis(1:Nrow) * Coeff(1:Nrow) )
171
TextAtIP = SUM( Basis(1:Nrow) * Text(1:Nrow) )
172
173
DO p=1,n
174
DO q=1,n
175
STIFF(p,q) = STIFF(p,q) + Weight * CoeffAtIP * &
176
Basis(p)*Basis(q)
177
END DO
178
FORCE(p) = FORCE(p) + Weight * Basis(p) * &
179
( FluxAtIP + CoeffAtIP * TextAtIP )
180
END DO
181
END DO
182
183
!------------------------------------------------------------------------------
184
END SUBROUTINE BoundaryAssembly
185
!------------------------------------------------------------------------------
186
187
188