Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/elmerice/UserFunctions/CaffeFlow.F90
3196 views
1
!/*****************************************************************************/
2
! *
3
! * Elmer/Ice, a glaciological add-on to Elmer
4
! * http://elmerice.elmerfem.org
5
! *
6
! *
7
! * This program is free software; you can redistribute it and/or
8
! * modify it under the terms of the GNU General Public License
9
! * as published by the Free Software Foundation; either version 2
10
! * of the License, or (at your option) any later version.
11
! *
12
! * This program is distributed in the hope that it will be useful,
13
! * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
! * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
! * GNU General Public License for more details.
16
! *
17
! * You should have received a copy of the GNU General Public License
18
! * along with this program (in file fem/GPL-2); if not, write to the
19
! * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20
! * Boston, MA 02110-1301, USA.
21
! *
22
! *****************************************************************************/
23
! ******************************************************************************
24
! *
25
! * Authors: Juha Ruokolainen, Hakime Seddik
26
! * Email: [email protected]
27
! * Address: Institute of Low Temperature Science
28
! * Hokkaido University
29
! * Sapporo-shi Kita-ku, Kita 19, nishi 6
30
! * Hokkaido ; Japan
31
! * EMail: [email protected]
32
! * Web: http://elmerice.elmerfem.org
33
! *
34
! * Original Date: 9 July 1997
35
! * Modification Date:
36
! *
37
! *****************************************************************************
38
!> CaffeFlow.f90 anisotropic model for ice flow
39
!> Caffe model: viscosity factor as a function of ice anisotropy and temperature
40
FUNCTION caffeGetViscosity ( Model, nodenumber, temperature ) RESULT(anisoVisFact)
41
USE types
42
USE DefUtils
43
USE CoordinateSystems
44
USE SolverUtils
45
USE ElementDescription
46
!-----------------------------------------------------------
47
IMPLICIT NONE
48
!------------ external variables ---------------------------
49
TYPE(Model_t) :: Model
50
INTEGER :: nodenumber
51
REAL(KIND=dp) :: temperature, anisoVisFact
52
!------------ internal variables----------------------------
53
TYPE(Element_t), POINTER :: CurrentElement
54
TYPE(Nodes_t) :: ElementNodes
55
TYPE(Variable_t), POINTER :: FlowVariable, FabricVariable, TempVariable
56
TYPE(ValueList_t), POINTER :: Material
57
REAL(KIND=dp), POINTER :: Hwrk(:,:,:)
58
REAL(KIND=dp) :: LocalVelo(3, Model % MaxElementNodes)
59
REAL(KIND=dp), DIMENSION(Model % MaxElementNodes) :: Expo
60
REAL(KIND=dp) ::&
61
rateFactor, aToMinusOneThird, gasconst, temphom
62
REAL (KIND=dp), ALLOCATABLE :: activationEnergy(:,:), arrheniusFactor(:,:),&
63
aniEnhancementFact(:), viscosityExponent(:), PressureMeltingPoint(:),&
64
LimitTemp(:)
65
REAL(KIND=dp), POINTER :: FlowValues(:), FabricValues(:), TempValues(:)
66
REAL(KIND=dp) :: Basis( Model % MaxElementNodes ), ddBasisddx(1,1,1), dBasisdx( Model % MaxElementNodes , 3 )
67
REAL(KIND=dp) :: u, v, w, detJ, LGrad(3,3), Dij(3,3)
68
REAL (KIND=dp) :: a1133, a2233, a3333, a3331, a3332, a3312
69
REAL (KIND=dp) :: AfirstArg,AsecondArg, Aconst, Eps
70
REAL (KIND=dp) :: Emin, MinGamma
71
REAL(KIND=dp) :: a2(6), a4(9), A, E, m, Temp
72
INTEGER, POINTER :: FlowPerm(:), FabricPerm(:), TempPerm(:), NodeIndexes(:)
73
INTEGER :: DIM, nMax, t, i, j, k, STDOFs, n
74
INTEGER :: material_id, body_id, elementNbNodes, nodeInElement, istat
75
LOGICAL :: stat, FirstTime=.TRUE., GotIt
76
CHARACTER(LEN=MAX_NAME_LEN) :: TempName
77
78
!------------ remember this -------------------------------
79
SAVE ElementNodes, DIM, FirstTime, gasconst, activationEnergy, arrheniusFactor,&
80
aniEnhancementFact, viscosityExponent, Hwrk, PressureMeltingPoint, &
81
LimitTemp
82
83
!-----------------------------------------------------------
84
! Read in constants from SIF file and do some allocations
85
!-----------------------------------------------------------
86
IF (FirstTime) THEN
87
! inquire coordinate system dimensions and degrees of freedom from NS-Solver
88
! ---------------------------------------------------------------------------
89
90
ALLOCATE( ElementNodes % x ( Model % MaxElementNodes ), &
91
ElementNodes % y ( Model % MaxElementNodes ), &
92
ElementNodes % z ( Model % MaxElementNodes ) )
93
94
DIM = CoordinateSystemDimension()
95
96
gasconst = ListGetConstReal( Model % Constants,'Gas Constant',GotIt)
97
IF (.NOT. GotIt) THEN
98
gasconst = 8.314D00 ! m-k-s
99
WRITE(Message,'(a,e10.4,a)') 'No entry for Gas Constant (Constants) in input file found. Setting to ',&
100
gasconst,' (J/mol)'
101
CALL INFO('CAFFE (CAFFEViscosity)', Message, level=4)
102
END IF
103
nMax = Model % MaxElementNodes
104
ALLOCATE(activationEnergy(2,nMax),&
105
arrheniusFactor(2,nMax),&
106
LimitTemp( nMax),&
107
aniEnhancementFact(nMax),&
108
PressureMeltingPoint( nMax ),&
109
viscosityExponent(nMax),&
110
STAT=istat)
111
IF ( istat /= 0 ) THEN
112
CALL Fatal('CAFFE (CAFFEViscosity)','Memory allocation error, Aborting.')
113
END IF
114
NULLIFY( Hwrk )
115
FirstTime = .FALSE.
116
CALL Info('CAFFE (CAFFEViscosity)','Memory allocations done', Level=3)
117
END IF
118
119
!---------------------------------------------
120
! get element properties and solver variables
121
!---------------------------------------------
122
FlowVariable => VariableGet( Model % Solver % Mesh % Variables, "flow solution" )
123
IF ( ASSOCIATED( FlowVariable ) ) THEN
124
FlowPerm => FlowVariable % Perm
125
FlowValues => FlowVariable % Values
126
ELSE
127
CALL Info('CAFFE', &
128
& 'No variable for velocity associated.', Level=4)
129
END IF
130
131
STDOFs = FlowVariable % DOFs
132
133
FabricVariable => VariableGet( Model % Solver % Mesh % Variables, "fabric" )
134
IF ( ASSOCIATED( FabricVariable ) ) THEN
135
FabricPerm => FabricVariable % Perm
136
FabricValues => FabricVariable % Values
137
ELSE
138
CALL Info('CAFFE', &
139
& 'No variable for fabric associated.', Level=4)
140
END IF
141
142
143
! TempVariable => VariableGet( Model % Solver % Mesh % Variables, 'Temperature' )
144
! IF ( ASSOCIATED( TempVariable) ) THEN
145
! TempPerm => TempVariable % Perm
146
! TempValues => TempVariable % Values
147
! END IF
148
149
body_id = Model % CurrentElement % BodyId
150
151
material_id = ListGetInteger(Model % Bodies(body_id) % Values, 'Material', GotIt)
152
IF (.NOT.GotIt) CALL FATAL('CAFFE (CAFFEViscosity)','No Material ID found')
153
154
CurrentElement => Model % CurrentElement
155
elementNbNodes = GetElementNOFNodes()
156
IF (.NOT. GotIt) THEN
157
WRITE(Message,'(a,I2,a,I2,a)') 'No material id for current element of node ',nodenumber,', body ',body_id,' found'
158
CALL FATAL('CAFFE (CAFFEViscosity)', Message)
159
END IF
160
NodeIndexes => CurrentElement % NodeIndexes
161
162
163
Material => Model % Materials(material_id) % Values
164
IF (.NOT.ASSOCIATED(Material)) THEN
165
WRITE(Message,'(a,I2,a,I2,a)') 'No Material for current element of node ',nodenumber,', body ',body_id,' found'
166
CALL FATAL('CAFFE (CAFFEViscosity)',Message)
167
END IF
168
169
ElementNodes % x(1:elementNbNodes) = Model % Nodes % x(NodeIndexes(1:elementNbNodes))
170
ElementNodes % y(1:elementNbNodes) = Model % Nodes % y(NodeIndexes(1:elementNbNodes))
171
ElementNodes % z(1:elementNbNodes) = Model % Nodes % z(NodeIndexes(1:elementNbNodes))
172
173
! 2D U,V,p STDOFs=3
174
! 3D U,V,W,p STDOFs=4
175
LocalVelo = 0.0_dp
176
DO i = 1, STDOFs - 1
177
LocalVelo(i,1:elementNbNodes) = FlowValues( STDOFs*(FlowPerm(NodeIndexes(1:elementNbNodes))-1) + i)
178
END DO
179
180
! Locala11(1:n) = FabricValues( 5 * (FabricPerm(NodeIndexes(1:n))-1) + 1 )
181
! Locala22(1:n) = FabricValues( 5 * (FabricPerm(NodeIndexes(1:n))-1) + 2 )
182
! Locala12(1:n) = FabricValues( 5 * (FabricPerm(NodeIndexes(1:n))-1) + 3 )
183
! Locala23(1:n) = FabricValues( 5 * (FabricPerm(NodeIndexes(1:n))-1) + 4 )
184
! Locala31(1:n) = FabricValues( 5 * (FabricPerm(NodeIndexes(1:n))-1) + 5 )
185
186
187
DO i=1,elementNbNodes
188
IF (nodenumber == NodeIndexes( i )) THEN
189
190
!-------------------------------------------
191
! get material properties
192
!-------------------------------------------
193
! activation energies
194
!--------------------
195
CALL ListGetRealArray( Material,'Activation Energies',Hwrk, elementNbNodes, &
196
Model % CurrentElement % NodeIndexes, GotIt )
197
IF (.NOT. GotIt) THEN
198
WRITE(Message,'(a,I2,a,I2)') 'No Value for Activation Energy found in Material ', material_id,' for node ', nodenumber
199
CALL FATAL(' CAFFE (CAFFEViscosity)',Message)
200
END IF
201
IF ( SIZE(Hwrk,2) == 1 ) THEN
202
DO j=1,MIN(3,SIZE(Hwrk,1))
203
activationEnergy(j,1:elementNbNodes) = Hwrk(j,1,1:elementNbNodes)
204
END DO
205
ELSE
206
WRITE(Message,'(a,I2,a,I2)') 'Incorrect array size for Activation Energy in Material ', material_id,' for node ', nodenumber
207
CALL FATAL('CAFFE (CAFFEViscosity)',Message)
208
END IF
209
210
! Arrhenius Factors
211
! ------------------
212
CALL ListGetRealArray( Material,'Arrhenius Factors',Hwrk,elementNbNodes, &
213
Model % CurrentElement % NodeIndexes, GotIt )
214
IF (.NOT. GotIt) THEN
215
WRITE(Message,'(a,I2,a,I2)') 'No Value for Arrhenius Factors found in Material ', material_id,' for node ', nodenumber
216
CALL FATAL('CAFFE (CAFFEViscosity)',Message)
217
END IF
218
IF ( SIZE(Hwrk,2) == 1 ) THEN
219
DO j=1,MIN(3,SIZE(Hwrk,1))
220
arrheniusFactor(j,1:elementNbNodes) = Hwrk(j,1,1:elementNbNodes)
221
END DO
222
ELSE
223
WRITE(Message,'(a,I2,a,I2)') 'Incorrect array size for Arrhenius Factors in Material ', material_id,' for node ', nodenumber
224
CALL FATAL('CAFFE (CAFFEViscosity)',Message)
225
END IF
226
227
! Threshold temperature for switching activation energies and Arrhenius factors
228
!------------------------------------------------------------------------------
229
LimitTemp(1:elementNbNodes) = ListGetReal( Material,'Limit Temperature', elementNbNodes,&
230
Model % CurrentElement % NodeIndexes, GotIt )
231
IF (.NOT. GotIt) THEN
232
LimitTemp(1:elementNbNodes) = -1.0D01
233
WRITE(Message,'(a,I2,a,I2,a)') 'No keyword >Limit Temperature< found in Material ',&
234
material_id,' for node ', nodenumber, '.setting to -10'
235
CALL INFO('CAFFE (CAFFEViscosity)', Message, level=4)
236
END IF
237
238
! Viscosity Exponent
239
!-------------------
240
viscosityExponent(1:elementNbNodes) = ListGetReal( Material,'Viscosity Exponent', elementNbNodes, &
241
Model % CurrentElement % NodeIndexes, GotIt )
242
IF (.NOT. GotIt) THEN
243
viscosityExponent(1:elementNbNodes) = 1.0D00/3.0D00
244
WRITE(Message,'(a,I2,a,I2,a)') 'No Viscosity Exponent found in Material ', material_id,&
245
' for node ', nodenumber, '.setting k=1/3'
246
CALL INFO('CAFFE (CAFFEViscosity)', Message, level=4)
247
END IF
248
249
! Enhancement factor for anisotropic flow law
250
! -------------------------------------------
251
aniEnhancementFact(1:elementNbNodes) = ListGetReal( Material,'Anisotropic Enhancement Factor', &
252
elementNbNodes, Model % CurrentElement % NodeIndexes, GotIt )
253
IF (.NOT. GotIt) THEN
254
WRITE(Message,'(a,I2,a,I2,a)') 'Value for Maximum Enhancement factor not found in Matrial', &
255
material_id,' for node ', nodenumber
256
CALL Fatal('CAFFE (CAFFEViscosity)', Message)
257
END IF
258
259
! Critical Enhancement factor to avoid singularities in anisotropic flow law
260
! --------------------------------------------------------------------------
261
Emin = GetConstReal(Material, 'Critical Enhancement factor', GotIt)
262
IF(.NOT. GotIt) THEN
263
Emin=0.0001
264
WRITE(Message,'(a,I2,a,I2,a)') 'Value for Critical Enhancement factor not found in Matrial', &
265
material_id,' for node ', nodenumber, '.setting Emin=1.Oe-4'
266
CALL INFO('CAFFE (CAFFEViscosity)', Message, level=3)
267
END IF
268
269
! Critical parameter to avoid singulairties in computing the polycrystall deformability
270
! -------------------------------------------------------------------------------------
271
MinGamma = GetConstReal(Material, 'Critical Strain Rate', GotIt)
272
IF(.NOT. GotIt) THEN
273
MinGamma=1.0e-15
274
WRITE(Message,'(a,I2,a,I2,a)') 'Critical Strain rate not found in Matrial', material_id, &
275
' for node ', nodenumber, '.setting MinGamma=1.0e-15'
276
Call INFO('CAFFE (CAFFEViscosity)', Message, level=3)
277
END IF
278
279
! Pressure Melting Point and homologous temperature
280
! --------------------------------------------------
281
TempName = GetString(Material ,'Temperature Name', GotIt)
282
IF (.NOT.GotIt) CALL FATAL('CAFFE (CAFFEViscosity)','No Temperature Name found')
283
PressureMeltingPoint(1:elementNbNodes) =&
284
ListGetReal( Material, TRIM(TempName) // ' Upper Limit',&
285
elementNbNodes, Model % CurrentElement % NodeIndexes, GotIt)
286
IF (.NOT.GotIt) THEN
287
temphom = 0.0d00
288
WRITE(Message,'(A,A,A,i3,A)') 'No entry for ',TRIM(TempName) // ' Upper Limit',&
289
' found in material no. ', material_id,'. Using 273.16 K.'
290
CALL WARN('iceproperties (getViscosityFactor)',Message)
291
ELSE
292
temphom = MIN(temperature - PressureMeltingPoint(i), 0.0d00)
293
END IF
294
!----------------------------------------------------
295
! homologous Temperature is below -10 degrees celsius
296
!----------------------------------------------------
297
IF (temphom < LimitTemp(i)) THEN
298
k=1
299
!----------------------------------------------------
300
! homologous Temperature is above -10 degrees celsius
301
!----------------------------------------------------
302
ELSE
303
k=2
304
END IF
305
!----------------------------------------------
306
! Comput the rate factor
307
!----------------------------------------------
308
rateFactor =&
309
arrheniusFactor(k,i)*exp(-1.0D00*activationEnergy(k,i)/(gasconst*(2.7315D02 + temphom)))
310
311
! u, v, w local coord of node i
312
u = CurrentElement % TYPE % NodeU(i)
313
v = CurrentElement % TYPE % NodeV(i)
314
w = CurrentElement % TYPE % NodeW(i)
315
316
stat = ElementInfo(CurrentElement, ElementNodes, u, v, w, detJ, &
317
Basis, dBasisdx, ddBasisddx, .FALSE., .FALSE.)
318
319
LGrad = MATMUL( LocalVelo(:,1:elementNbNodes), dBasisdx(1:elementNbNodes,:))
320
321
Dij = 0.5_dp * ( LGrad + TRANSPOSE(LGrad) )
322
323
! Temp = TempValues( TempPerm( NodeIndexes(i) ) )
324
! m = Expo( i )
325
326
IF ( ASSOCIATED( FabricVariable ) ) THEN
327
a2(1) = FabricValues( 5 * (FabricPerm(NodeIndexes(i))-1) + 1 )
328
a2(2) = FabricValues( 5 * (FabricPerm(NodeIndexes(i))-1) + 2 )
329
a2(3) = 1.0_dp - a2(1) - a2(2)
330
a2(4) = FabricValues( 5 * (FabricPerm(NodeIndexes(i))-1) + 3 )
331
a2(5) = FabricValues( 5 * (FabricPerm(NodeIndexes(i))-1) + 4 )
332
a2(6) = FabricValues( 5 * (FabricPerm(NodeIndexes(i))-1) + 5 )
333
! a2(1) = SUM( Locala11(1:n) * Basis(1:n) )
334
ELSE
335
a2(4:6) = 0.0
336
a2(1:3) = 1.0/3.0_dp
337
END IF
338
339
CALL IBOF( a2, a4 )
340
341
!Compute the rest of the components of the a4 orientation tensor
342
343
! a1133 = -a1111+a11-a1122
344
a1133 = -a4(1)+a2(1)-a4(3)
345
346
! a2233 = -a2222+a22-a1122
347
a2233 = -a4(2)+a2(2)-a4(3)
348
349
! a3333 = a33-a1133-a2233
350
a3333 = a2(3)-a1133-a2233
351
352
! a3331=a1333=a13-a1311-a1322=a13-a1131-a2231
353
a3331 = a2(6)-a4(6)-a4(5)
354
355
! a3332=a2333=a23-a2311-a2322=a23-a1123-a2223
356
a3332 = a2(5)-a4(4)-a4(8)
357
358
! a3312=a1233=a12-a1211-a1222=a12-a1112-a2212
359
a3312 = a2(4)-a4(7)-a4(9)
360
361
!If necessary correct D11, D22, D33 to preserve incompressibility
362
Eps = Dij(1,1)+Dij(2,2)+Dij(3,3)
363
IF (Eps > 0 .OR. Eps < 0 ) THEN
364
Eps = Eps/3.0D00
365
366
Dij(1,1)= Dij(1,1)-Eps
367
Dij(2,2)= Dij(2,2)-Eps
368
Dij(3,3)= Dij(3,3)-Eps
369
END IF
370
371
! Computes the arguments of the equation of A
372
AfirstArg = a2(1)*((Dij(1,1))**2.0+(Dij(1,2))**2.0+(Dij(1,3))**2.0) &
373
+a2(2)*((Dij(1,2))**2.0+(Dij(2,2))**2.0+(Dij(2,3))**2.0) &
374
+a2(3)*((Dij(1,3))**2.0+(Dij(2,3))**2.0+(Dij(3,3))**2.0) &
375
+a2(4)*(2.0*Dij(1,1)*Dij(1,2)+2.0*Dij(2,2)*Dij(1,2)+2.0*Dij(2,3)*Dij(1,3)) &
376
+a2(5)*(2.0*Dij(1,3)*Dij(1,2)+2.0*Dij(2,2)*Dij(2,3)+2.0*Dij(3,3)*Dij(2,3)) &
377
+a2(6)*(2.0*Dij(1,1)*Dij(1,3)+2.0*Dij(2,3)*Dij(1,2)+2.0*Dij(3,3)*Dij(1,3))
378
379
AsecondArg = a4(1)*(Dij(1,1))**2.0+a4(2)*(Dij(2,2))**2.0+a3333*(Dij(3,3))**2.0 &
380
+a4(3)*(2*Dij(1,1)*Dij(2,2)+4.0*(Dij(1,2))**2.0) &
381
+a1133*(2*Dij(1,1)*Dij(3,3)+4.0*(Dij(1,3))**2.0) &
382
+a2233*(2*Dij(2,2)*Dij(3,3)+4.0*(Dij(2,3))**2.0) &
383
+4.0*a4(4)*Dij(1,1)*Dij(2,3)+8.0*a4(4)*Dij(1,2)*Dij(1,3) &
384
+4.0*a4(5)*Dij(2,2)*Dij(1,3)+8.0*a4(5)*Dij(1,2)*Dij(2,3) &
385
+4.0*a3312*Dij(3,3)*Dij(1,2)+8.0*a3312*Dij(1,3)*Dij(2,3) &
386
+4.0*a4(7)*Dij(1,1)*Dij(1,2)+4.0*a4(6)*Dij(1,1)*Dij(1,3) &
387
+4.0*a4(9)*Dij(2,2)*Dij(2,1)+4.0*a4(8)*Dij(2,2)*Dij(2,3) &
388
+4.0*a3331*Dij(3,3)*Dij(1,3)+4.0*a3332*Dij(3,3)*Dij(2,3)
389
390
391
! Compute the 5/tr(D)^2
392
Aconst = (Dij(1,1))**2.0+(Dij(2,2))**2.0+(Dij(3,3))**2.0+2.0*(Dij(1,2))**2.0+ &
393
2.0*(Dij(3,1))**2.0+2.0*(Dij(2,3))**2.0
394
395
IF (Aconst < MinGamma) Aconst = MinGamma
396
397
! IF (sqrt(2.0*Aconst) < MinGamma) THEN
398
! A = 1.0_dp
399
! ELSE
400
401
! Compute the value of A=(5/tr(D)^2)*(D.a2.D-(a4:D):D)
402
A = 5.0_dp * (AfirstArg-AsecondArg) / Aconst
403
! END IF
404
405
! Compute the Enhancement factor function
406
IF (A >= 1.0 ) THEN
407
E = (4.0*A**2.0*(aniEnhancementFact(i)-1.0)+25.0-4.0*aniEnhancementFact(i))/21.0
408
ELSE
409
E = (1.0-Emin)*A**((8.0/21.0)*((aniEnhancementFact(i)-1.0)/(1.0-Emin)))+Emin
410
END IF
411
412
! Compute the viscosity
413
anisoVisFact = 1.0D00 / (( 2.0D00 * E * rateFactor )**viscosityExponent(i))
414
415
EXIT
416
END IF
417
END DO
418
! write(*,*)A,E,anisoVisFact
419
420
CONTAINS
421
422
!!! Compute fourth order tensor a4 from a2 with closure function IBOF (Chung, 2002)
423
!!! a2 enters in the order : 11, 22, 33, 12, 23 ,13
424
!!! Output for a4 is in the order : 1111, 2222, 1122, 1123, 2231, 1131, 1112, 2223, 2212
425
!!! Code modified from Gillet-Chaullet source
426
!------------------------------------------------------------------------------
427
SUBROUTINE IBOF(a2,a4)
428
429
USE Types
430
431
implicit none
432
Real(dp),dimension(6),intent(in):: a2
433
Real(dp),dimension(9),intent(out):: a4
434
Real(dp):: a_11,a_22,a_33,a_12,a_13,a_23
435
Real(dp):: b_11,b_22,b_12,b_13,b_23
436
Real(dp):: aPlusa
437
438
Real(dp),dimension(21) :: vec
439
Real(dp),dimension(3,21) :: Mat
440
Real(dp),dimension(6) :: beta
441
Real(dp) :: Inv2,Inv3
442
integer :: i,j
443
444
445
a_11=a2(1)
446
a_22=a2(2)
447
a_33=a2(3)
448
a_12=a2(4)
449
a_23=a2(5)
450
a_13=a2(6)
451
452
453
!Coefficiants
454
455
Mat(1,1)=0.217774509809788e+02_dp
456
Mat(1,2)=-.297570854171128e+03_dp
457
Mat(1,3)=0.188686077307885e+04_dp
458
Mat(1,4)=-.272941724578513e+03_dp
459
Mat(1,5)=0.417148493642195e+03_dp
460
Mat(1,6)=0.152038182241196e+04_dp
461
Mat(1,7)=-.137643852992708e+04_dp
462
Mat(1,8)=-.628895857556395e+03_dp
463
Mat(1,9)=-.526081007711996e+04_dp
464
Mat(1,10)=-.266096234984017e+03_dp
465
Mat(1,11)=-.196278098216953e+04_dp
466
Mat(1,12)=-.505266963449819e+03_dp
467
Mat(1,13)=-.110483041928547e+03_dp
468
Mat(1,14)=0.430488193758786e+04_dp
469
Mat(1,15)=-.139197970442470e+02_dp
470
Mat(1,16)=-.144351781922013e+04_dp
471
Mat(1,17)=-.265701301773249e+03_dp
472
Mat(1,18)=-.428821699139210e+02_dp
473
Mat(1,19)=-.443236656693991e+01_dp
474
Mat(1,20)=0.309742340203200e+04_dp
475
Mat(1,21)=0.386473912295113e+00_dp
476
Mat(2,1)=-.514850598717222e+00_dp
477
Mat(2,2)=0.213316362570669e+02_dp
478
Mat(2,3)=-.302865564916568e+03_dp
479
Mat(2,4)=-.198569416607029e+02_dp
480
Mat(2,5)=-.460306750911640e+02_dp
481
Mat(2,6)=0.270825710321281e+01_dp
482
Mat(2,7)=0.184510695601404e+03_dp
483
Mat(2,8)=0.156537424620061e+03_dp
484
Mat(2,9)=0.190613131168980e+04_dp
485
Mat(2,10)=0.277006550460850e+03_dp
486
Mat(2,11)=-.568117055198608e+02_dp
487
Mat(2,12)=0.428921546783467e+03_dp
488
Mat(2,13)=0.142494945404341e+03_dp
489
Mat(2,14)=-.541945228489881e+04_dp
490
Mat(2,15)=0.233351898912768e+02_dp
491
Mat(2,16)=0.104183218654671e+04_dp
492
Mat(2,17)=0.331489412844667e+03_dp
493
Mat(2,18)=0.660002154209991e+02_dp
494
Mat(2,19)=0.997500770521877e+01_dp
495
Mat(2,20)=0.560508628472486e+04_dp
496
Mat(2,21)=0.209909225990756e+01_dp
497
Mat(3,1)=0.203814051719994e+02_dp
498
Mat(3,2)=-.283958093739548e+03_dp
499
Mat(3,3)=0.173908241235198e+04_dp
500
Mat(3,4)=-.195566197110461e+03_dp
501
Mat(3,5)=-.138012943339611e+03_dp
502
Mat(3,6)=0.523629892715050e+03_dp
503
Mat(3,7)=0.859266451736379e+03_dp
504
Mat(3,8)=-.805606471979730e+02_dp
505
Mat(3,9)=-.468711180560599e+04_dp
506
Mat(3,10)=0.889580760829066e+01_dp
507
Mat(3,11)=-.782994158054881e+02_dp
508
Mat(3,12)=-.437214580089117e+02_dp
509
Mat(3,13)=0.112996386047623e+01_dp
510
Mat(3,14)=0.401746416262936e+04_dp
511
Mat(3,15)=0.104927789918320e+01_dp
512
Mat(3,16)=-.139340154288711e+03_dp
513
Mat(3,17)=-.170995948015951e+02_dp
514
Mat(3,18)=0.545784716783902e+00_dp
515
Mat(3,19)=0.971126767581517e+00_dp
516
Mat(3,20)=0.141909512967882e+04_dp
517
Mat(3,21)=0.994142892628410e+00_dp
518
519
520
! Compute the invariants
521
Inv2=0.5_dp*(1._dp-(a_11*a_11+a_22*a_22+a_33*a_33+ &
522
2._dp*(a_12*a_12+a_13*a_13+a_23*a_23)))
523
524
Inv3=a_11*(a_22*a_33-a_23*a_23)+a_12*(a_23*a_13-a_12*a_33)+ &
525
a_13*(a_12*a_23-a_22*a_13)
526
527
! complete polynome of degree 5 for the 2 invariants.
528
vec(1)=1._dp
529
vec(2)=Inv2
530
vec(3)=vec(2)*vec(2)
531
vec(4)=Inv3
532
vec(5)=vec(4)*vec(4)
533
vec(6)=vec(2)*vec(4)
534
vec(7)=vec(3)*vec(4)
535
vec(8)=vec(2)*vec(5)
536
vec(9)=vec(2)*vec(3)
537
vec(10)=vec(5)*vec(4)
538
vec(11)=vec(9)*vec(4)
539
vec(12)=vec(3)*vec(5)
540
vec(13)=vec(2)*vec(10)
541
vec(14)=vec(3)*vec(3)
542
vec(15)=vec(5)*vec(5)
543
vec(16)=vec(14)*vec(4)
544
vec(17)=vec(12)*vec(2)
545
vec(18)=vec(12)*vec(4)
546
vec(19)=vec(2)*vec(15)
547
vec(20)=vec(14)*vec(2)
548
vec(21)=vec(15)*vec(4)
549
550
! Compites beta_bar (cf annexe C Chung)
551
! Warning: beta(1)=beta_bar_3 (Chung); beta(2)=beta_bar_4; beta(3)=beta_bar_6
552
! beta(4)=beta_bar_1 ; beta(5)=beta_bar_2; beta(6)=beta_bar_5
553
554
! calcul the three betas in terms of the polynomes
555
beta(:)=0._dp
556
Do i=1,3
557
Do j=1,21
558
beta(i)=beta(i)+Mat(i,j)*vec(j)
559
End do
560
End do
561
562
! calcul the other 3 to get the normalisation
563
beta(4)=3._dp*(-1._dp/7._dp+beta(1)*(1._dp/7._dp+4._dp*Inv2/7._dp+8._dp*Inv3/3._dp)/5._dp- &
564
beta(2)*(0.2_dp-8._dp*Inv2/15._dp-14._dp*Inv3/15._dp)- &
565
beta(3)*(1._dp/35._dp-24._dp*Inv3/105._dp-4._dp*Inv2/35._dp+ &
566
16._dp*Inv2*Inv3/15._dp+8._dp*Inv2*Inv2/35._dp))/5._dp
567
568
beta(5)=6._dp*(1._dp-0.2_dp*beta(1)*(1._dp+4._dp*Inv2)+ &
569
7._dp*beta(2)*(1._dp/6._dp-Inv2)/5._dp- &
570
beta(3)*(-0.2_dp+2._dp*Inv3/3._dp+4._dp*Inv2/5._dp- &
571
8._dp*Inv2*Inv2/5._dp))/7._dp
572
573
beta(6)=-4._dp*beta(1)/5._dp-7._dp*beta(2)/5._dp- &
574
6._dp*beta(3)*(1._dp-4._dp*Inv2/3._dp)/5._dp
575
576
!beta_bar
577
Do i=1,6
578
beta(i)=beta(i)/3._dp
579
End do
580
beta(2)=beta(2)/2._dp
581
beta(5)=beta(5)/2._dp
582
beta(6)=beta(6)/2._dp
583
584
!! Compute 5 b=a.a
585
b_11=a_11*a_11+a_12*a_12+a_13*a_13
586
b_22=a_22*a_22+a_12*a_12+a_23*a_23
587
b_12=a_11*a_12+a_12*a_22+a_13*a_23
588
b_13=a_11*a_13+a_12*a_23+a_13*a_33
589
b_23=a_12*a_13+a_22*a_23+a_23*a_33
590
591
!Compute the 9 terms of a4
592
593
a4(1)=3._dp*beta(4)+6._dp*beta(5)*a_11+3._dp*beta(1)*a_11*a_11+&
594
6._dp*beta(2)*b_11+6._dp*beta(6)*a_11*b_11+3._dp*beta(3)*b_11*b_11
595
a4(2)=3._dp*beta(4)+6._dp*beta(5)*a_22+3._dp*beta(1)*a_22*a_22+&
596
6._dp*beta(2)*b_22+6._dp*beta(6)*a_22*b_22+3._dp*beta(3)*b_22*b_22
597
598
a4(3)=beta(4)+beta(5)*(a_22+a_11)+beta(1)*(a_11*a_22+2._dp*a_12*a_12)+&
599
beta(2)*(b_22+b_11)+beta(6)*(a_11*b_22+a_22*b_11+4._dp*a_12*b_12)+&
600
beta(3)*(b_11*b_22+2._dp*b_12*b_12)
601
602
603
a4(4)=beta(5)*a_23+beta(1)*(a_11*a_23+2._dp*a_12*a_13)+beta(2)*b_23+&
604
beta(6)*(a_11*b_23+a_23*b_11+2._dp*(a_12*b_13+a_13*b_12))+beta(3)*&
605
(b_11*b_23+2._dp*b_12*b_13)
606
a4(5)=beta(5)*a_13+beta(1)*(a_22*a_13+2._dp*a_12*a_23)+beta(2)*b_13+&
607
beta(6)*(a_22*b_13+a_13*b_22+2._dp*(a_12*b_23+a_23*b_12))+beta(3)*&
608
(b_22*b_13+2._dp*b_12*b_23)
609
610
611
a4(6)=3._dp*beta(5)*a_13+3._dp*beta(1)*a_11*a_13+3._dp*beta(2)*b_13+&
612
3._dp*beta(6)*(a_11*b_13+a_13*b_11)+3._dp*beta(3)*b_11*b_13
613
a4(7)=3._dp*beta(5)*a_12+3._dp*beta(1)*a_11*a_12+3._dp*beta(2)*b_12+&
614
3._dp*beta(6)*(a_11*b_12+a_12*b_11)+3._dp*beta(3)*b_11*b_12
615
a4(8)=3._dp*beta(5)*a_23+3._dp*beta(1)*a_22*a_23+3._dp*beta(2)*b_23+&
616
3._dp*beta(6)*(a_22*b_23+a_23*b_22)+3._dp*beta(3)*b_22*b_23
617
a4(9)=3._dp*beta(5)*a_12+3._dp*beta(1)*a_22*a_12+3._dp*beta(2)*b_12+&
618
3._dp*beta(6)*(a_22*b_12+a_12*b_22)+3._dp*beta(3)*b_22*b_12
619
620
END SUBROUTINE IBOF
621
!**************************************************************************************
622
623
END FUNCTION caffeGetViscosity
624
625