Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/elmerice/UserFunctions/USF_Zs.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: Olivier Gagliardini, Ga¨el Durand
26
! * Email:
27
! * Web: http://elmerice.elmerfem.org
28
! *
29
! * Original Date:
30
! *
31
! *****************************************************************************
32
!> ZsMZsIni for variable Zs
33
!> ZsTopMZsIni for variable Zs Top
34
!> ZsBottomMZsIni for variable Zs Bottom
35
!> DyMDyIni for any FS variable name
36
!> *Calving for 2D calving simulations
37
FUNCTION ZsIni ( Model, nodenumber, x) RESULT(Zs)
38
USE types
39
USE CoordinateSystems
40
USE SolverUtils
41
USE ElementDescription
42
USE DefUtils
43
IMPLICIT NONE
44
TYPE(Variable_t), POINTER :: ZsSol
45
INTEGER, POINTER :: ZsPerm(:)
46
TYPE(Model_t) :: Model
47
TYPE(Solver_t), TARGET :: Solver
48
INTEGER :: nodenumber, NMAX, i, dim
49
REAL(KIND=dp) :: x, Zs
50
REAL(KIND=dp), ALLOCATABLE :: Zs0(:)
51
LOGICAL :: FirstTime=.True., UnFoundFatal=.TRUE.
52
53
SAVE FirstTime
54
SAVE Zs0
55
56
ZsSol => VariableGet( Model % Variables, 'Zs',UnFoundFatal=UnFoundFatal)
57
ZsPerm => ZsSol % Perm
58
59
IF (FirstTime) THEN
60
FirstTime = .False.
61
dim = CoordinateSystemDimension()
62
NMAX = COUNT( ZsPerm > 0 )
63
ALLOCATE(Zs0(NMAX))
64
DO i = 1, Model % NumberOfNodes
65
IF (ZsPerm(i)==0) CYCLE
66
IF (dim==2) THEN
67
Zs0(ZsPerm(i)) = Model % Nodes % y (i)
68
ELSE
69
Zs0(ZsPerm(i)) = Model % Nodes % z (i)
70
END IF
71
END DO
72
END IF
73
74
Zs = Zs0(ZsPerm(nodenumber))
75
76
END FUNCTION ZsIni
77
78
FUNCTION ZsMzsIni ( Model, nodenumber, Zs) RESULT(mu)
79
USE types
80
USE CoordinateSystems
81
USE SolverUtils
82
USE ElementDescription
83
USE DefUtils
84
IMPLICIT NONE
85
TYPE(Variable_t), POINTER :: ZsSol
86
INTEGER, POINTER :: ZsPerm(:)
87
TYPE(Model_t) :: Model
88
TYPE(Solver_t), TARGET :: Solver
89
INTEGER :: nodenumber, NMAX, i, dim
90
REAL(KIND=dp) :: mu, Zs
91
REAL(KIND=dp), ALLOCATABLE :: Zs0(:)
92
LOGICAL :: FirstTime=.True.,UnFoundFatal
93
94
SAVE FirstTime
95
SAVE Zs0
96
97
ZsSol => VariableGet( Model % Variables, 'Zs',UnFoundFatal=UnFoundFatal)
98
ZsPerm => ZsSol % Perm
99
100
IF (FirstTime) THEN
101
FirstTime = .False.
102
dim = CoordinateSystemDimension()
103
NMAX = COUNT( ZsPerm > 0 )
104
ALLOCATE(Zs0(NMAX))
105
DO i = 1, Model % NumberOfNodes
106
IF (ZsPerm(i)==0) CYCLE
107
IF (dim==2) THEN
108
Zs0(ZsPerm(i)) = Model % Nodes % y (i)
109
ELSE
110
Zs0(ZsPerm(i)) = Model % Nodes % z (i)
111
END IF
112
END DO
113
END IF
114
115
mu = Zs - Zs0(ZsPerm(nodenumber))
116
117
END FUNCTION ZsMZsIni
118
119
!--------------------------------------------------------------------------------
120
121
FUNCTION ZsTopIni ( Model, nodenumber, x) RESULT(Zs)
122
USE types
123
USE CoordinateSystems
124
USE SolverUtils
125
USE ElementDescription
126
USE DefUtils
127
IMPLICIT NONE
128
TYPE(Variable_t), POINTER :: ZsSol
129
INTEGER, POINTER :: ZsPerm(:)
130
TYPE(Model_t) :: Model
131
TYPE(Solver_t), TARGET :: Solver
132
INTEGER :: nodenumber, NMAX, i, dim
133
REAL(KIND=dp) :: x, Zs
134
REAL(KIND=dp), ALLOCATABLE :: Zs0(:)
135
LOGICAL :: FirstTime=.True.,UnFoundFatal
136
137
SAVE FirstTime
138
SAVE Zs0
139
140
ZsSol => VariableGet( Model % Variables, 'Zs Top',UnFoundFatal=UnFoundFatal)
141
ZsPerm => ZsSol % Perm
142
143
IF (FirstTime) THEN
144
FirstTime = .False.
145
dim = CoordinateSystemDimension()
146
NMAX = COUNT( ZsPerm > 0 )
147
ALLOCATE(Zs0(NMAX))
148
DO i = 1, Model % NumberOfNodes
149
IF (ZsPerm(i)==0) CYCLE
150
IF (dim==2) THEN
151
Zs0(ZsPerm(i)) = Model % Nodes % y (i)
152
ELSE
153
Zs0(ZsPerm(i)) = Model % Nodes % z (i)
154
END IF
155
END DO
156
END IF
157
158
Zs = Zs0(ZsPerm(nodenumber))
159
160
END FUNCTION ZsTopIni
161
162
FUNCTION ZsTopMzsIni ( Model, nodenumber, Zs) RESULT(mu)
163
USE types
164
USE CoordinateSystems
165
USE SolverUtils
166
USE ElementDescription
167
USE DefUtils
168
IMPLICIT NONE
169
TYPE(Variable_t), POINTER :: ZsSol
170
INTEGER, POINTER :: ZsPerm(:)
171
TYPE(Model_t) :: Model
172
TYPE(Solver_t), TARGET :: Solver
173
INTEGER :: nodenumber, NMAX, i, dim
174
REAL(KIND=dp) :: mu, Zs
175
REAL(KIND=dp), ALLOCATABLE :: Zs0(:)
176
LOGICAL :: FirstTime=.True.,UnFoundFatal
177
178
SAVE FirstTime
179
SAVE Zs0
180
181
ZsSol => VariableGet( Model % Variables, 'Zs Top',UnFoundFatal=UnFoundFatal)
182
ZsPerm => ZsSol % Perm
183
184
IF (FirstTime) THEN
185
FirstTime = .False.
186
dim = CoordinateSystemDimension()
187
NMAX = COUNT( ZsPerm > 0 )
188
ALLOCATE(Zs0(NMAX))
189
DO i = 1, Model % NumberOfNodes
190
IF (ZsPerm(i)==0) CYCLE
191
IF (dim==2) THEN
192
Zs0(ZsPerm(i)) = Model % Nodes % y (i)
193
ELSE
194
Zs0(ZsPerm(i)) = Model % Nodes % z (i)
195
END IF
196
END DO
197
END IF
198
199
mu = Zs - Zs0(ZsPerm(nodenumber))
200
201
END FUNCTION ZsTopMZsIni
202
203
!--------------------------------------------------------------------
204
205
FUNCTION ZsBottomIni ( Model, nodenumber, x) RESULT(Zs)
206
USE types
207
USE CoordinateSystems
208
USE SolverUtils
209
USE ElementDescription
210
USE DefUtils
211
IMPLICIT NONE
212
TYPE(Variable_t), POINTER :: ZsSol
213
INTEGER, POINTER :: ZsPerm(:)
214
TYPE(Model_t) :: Model
215
TYPE(Solver_t), TARGET :: Solver
216
INTEGER :: nodenumber, NMAX, i, dim
217
REAL(KIND=dp) :: x, Zs
218
REAL(KIND=dp), ALLOCATABLE :: Zs0(:)
219
LOGICAL :: FirstTime=.True.,UnFoundFatal
220
221
SAVE FirstTime
222
SAVE Zs0
223
224
ZsSol => VariableGet( Model % Variables, 'Zs Bottom',UnFoundFatal=UnFoundFatal)
225
ZsPerm => ZsSol % Perm
226
227
IF (FirstTime) THEN
228
FirstTime = .False.
229
dim = CoordinateSystemDimension()
230
NMAX = COUNT( ZsPerm > 0 )
231
ALLOCATE(Zs0(NMAX))
232
DO i = 1, Model % NumberOfNodes
233
IF (ZsPerm(i)==0) CYCLE
234
IF (dim==2) THEN
235
Zs0(ZsPerm(i)) = Model % Nodes % y (i)
236
ELSE
237
Zs0(ZsPerm(i)) = Model % Nodes % z (i)
238
END IF
239
END DO
240
END IF
241
242
Zs = Zs0(ZsPerm(nodenumber))
243
244
END FUNCTION ZsBottomIni
245
246
FUNCTION ZsBottomMzsIni ( Model, nodenumber, Zs) RESULT(mu)
247
USE types
248
USE CoordinateSystems
249
USE SolverUtils
250
USE ElementDescription
251
USE DefUtils
252
IMPLICIT NONE
253
TYPE(Variable_t), POINTER :: ZsSol
254
INTEGER, POINTER :: ZsPerm(:)
255
TYPE(Model_t) :: Model
256
TYPE(Solver_t), TARGET :: Solver
257
INTEGER :: nodenumber, NMAX, i, dim
258
REAL(KIND=dp) :: mu, Zs
259
REAL(KIND=dp), ALLOCATABLE :: Zs0(:)
260
LOGICAL :: FirstTime=.True.,UnFoundFatal
261
262
SAVE FirstTime
263
SAVE Zs0
264
265
ZsSol => VariableGet( Model % Variables, 'Zs Bottom',UnFoundFatal=UnFoundFatal)
266
ZsPerm => ZsSol % Perm
267
268
IF (FirstTime) THEN
269
FirstTime = .False.
270
dim = CoordinateSystemDimension()
271
NMAX = COUNT( ZsPerm > 0 )
272
ALLOCATE(Zs0(NMAX))
273
DO i = 1, Model % NumberOfNodes
274
IF (ZsPerm(i)==0) CYCLE
275
IF (dim==2) THEN
276
Zs0(ZsPerm(i)) = Model % Nodes % y (i)
277
ELSE
278
Zs0(ZsPerm(i)) = Model % Nodes % z (i)
279
END IF
280
END DO
281
END IF
282
283
mu = Zs - Zs0(ZsPerm(nodenumber))
284
285
END FUNCTION ZsBottomMZsIni
286
287
!---------------------------------------------------------------------------
288
289
FUNCTION DyIni ( Model, nodenumber, x) RESULT(Zs)
290
USE types
291
USE CoordinateSystems
292
USE SolverUtils
293
USE ElementDescription
294
USE DefUtils
295
IMPLICIT NONE
296
TYPE(Model_t) :: Model
297
TYPE(Solver_t), TARGET :: Solver
298
INTEGER :: nodenumber, NMAX, i, dim
299
REAL(KIND=dp) :: x, Zs
300
REAL(KIND=dp), ALLOCATABLE :: Zs0(:)
301
LOGICAL :: FirstTime=.True.
302
303
SAVE FirstTime
304
SAVE Zs0
305
306
IF (FirstTime) THEN
307
FirstTime = .FALSE.
308
NMAX = Model % NumberOfNodes
309
dim = CoordinateSystemDimension()
310
ALLOCATE(Zs0(NMAX))
311
DO i = 1, NMAX
312
IF (dim==2) THEN
313
Zs0(i) = Model % Nodes % y (i)
314
ELSE
315
Zs0(i) = Model % Nodes % z (i)
316
END IF
317
END DO
318
END IF
319
320
Zs = Zs0(nodenumber)
321
322
END FUNCTION DyIni
323
324
325
FUNCTION DyMDyIni ( Model, nodenumber, Zs) RESULT(mu)
326
USE types
327
USE CoordinateSystems
328
USE SolverUtils
329
USE ElementDescription
330
USE DefUtils
331
IMPLICIT NONE
332
TYPE(Model_t) :: Model
333
TYPE(Solver_t), TARGET :: Solver
334
INTEGER :: nodenumber, NMAX, i, dim
335
REAL(KIND=dp) :: mu, Zs
336
REAL(KIND=dp), ALLOCATABLE :: Zs0(:)
337
LOGICAL :: FirstTime=.True.
338
339
SAVE FirstTime
340
SAVE Zs0
341
342
IF (FirstTime) THEN
343
FirstTime = .FALSE.
344
NMAX = Model % NumberOfNodes
345
dim = CoordinateSystemDimension()
346
ALLOCATE(Zs0(NMAX))
347
DO i = 1, NMAX
348
IF (dim==2) THEN
349
Zs0(i) = Model % Nodes % y (i)
350
ELSE
351
Zs0(i) = Model % Nodes % z (i)
352
END IF
353
END DO
354
END IF
355
356
mu = Zs - Zs0(nodenumber)
357
358
END FUNCTION DyMDyIni
359
360
FUNCTION ZsBottomMzsIniCalving ( Model, nodenumber, Zs) RESULT(mu)
361
USE types
362
USE CoordinateSystems
363
USE SolverUtils
364
USE ElementDescription
365
USE DefUtils
366
IMPLICIT NONE
367
TYPE(Variable_t), POINTER :: ZsSol, Timevar
368
INTEGER, POINTER :: ZsPerm(:)
369
TYPE(Model_t) :: Model
370
TYPE(Solver_t), TARGET :: Solver
371
INTEGER :: nodenumber, NMAX, i, dim
372
REAL(KIND=dp) :: mu, Zs, t, told
373
REAL(KIND=dp), ALLOCATABLE :: Zs0(:), ZsPrev(:)
374
LOGICAL :: FirstTime=.True., NewTime=.TRUE., CalvingOccurs, &
375
RemeshOccurs, Found, Debug=.FALSE.
376
377
SAVE FirstTime, told, NewTime
378
SAVE Zs0, ZsPrev, ZsPerm, NMAX, dim
379
380
Debug = .FALSE.
381
! Real time import
382
Timevar => VariableGet( Model % Variables,'Time')
383
t = TimeVar % Values(1)
384
385
ZsSol => VariableGet( Model % Variables, 'Zs Bottom')
386
IF (ASSOCIATED(ZsSol)) THEN
387
ZsPerm => ZsSol % Perm
388
ELSE
389
CALL FATAL('ZsTopMZsIni','Could not find variable >Zs Bottom<')
390
END IF
391
392
IF (FirstTime) THEN
393
FirstTime = .False.
394
Newtime = .TRUE.
395
told = t
396
dim = CoordinateSystemDimension()
397
NMAX = COUNT( ZsPerm > 0 )
398
ALLOCATE(Zs0(NMAX),ZsPrev(NMAX))
399
DO i = 1, Model % NumberOfNodes
400
IF (ZsPerm(i)==0) CYCLE
401
IF (dim==2) THEN
402
Zs0(ZsPerm(i)) = Model % Nodes % y (i)
403
ELSE
404
Zs0(ZsPerm(i)) = Model % Nodes % z (i)
405
END IF
406
END DO
407
END IF
408
409
IF(t>told) Newtime = .TRUE.
410
411
CalvingOccurs = ListGetLogical( Model % Simulation, 'CalvingOccurs', Found)
412
IF(.NOT. Found) THEN
413
IF(Debug) CALL INFO("USF_Zs","Can't find CalvingOccurs Logical, assuming false")
414
CalvingOccurs = .FALSE.
415
END IF
416
417
RemeshOccurs = ListGetLogical( Model % Simulation, 'RemeshOccurs', Found)
418
IF(.NOT. Found) THEN
419
IF(Debug) CALL WARN("ZsBottomMZsIni","Can't find RemeshCondition Logical, assuming false!")
420
RemeshOccurs = .FALSE.
421
END IF
422
423
IF(Newtime) THEN
424
PRINT *, 'USF_Zs: New time, saving previous Zs values!'
425
told = t
426
Newtime = .FALSE.
427
DO i = 1, Model % NumberOfNodes
428
IF (ZsPerm(i)==0) CYCLE
429
IF (dim==2) THEN
430
ZsPrev(ZsPerm(i)) = Model % Nodes % y (i)
431
ELSE
432
ZsPrev(ZsPerm(i)) = Model % Nodes % z (i)
433
END IF
434
END DO
435
END IF
436
437
IF(CalvingOccurs .OR. RemeshOccurs) THEN
438
Zs0 = ZsPrev
439
END IF
440
441
mu = Zs - Zs0(ZsPerm(nodenumber))
442
!TEST
443
IF((CalvingOccurs .OR. RemeshOccurs) .AND. Debug) THEN
444
PRINT *, 'USF_Zs: At point ',Model % Nodes % x(nodenumber),' Zs is ',Zs,' and Zs0 is ',Zs0(ZsPerm(nodenumber))
445
END IF
446
447
448
END FUNCTION ZsBottomMZsIniCalving
449
450
FUNCTION ZsTopMzsIniCalving ( Model, nodenumber, Zs) RESULT(mu)
451
USE types
452
USE CoordinateSystems
453
USE SolverUtils
454
USE ElementDescription
455
USE DefUtils
456
IMPLICIT NONE
457
TYPE(Variable_t), POINTER :: ZsSol, Timevar
458
INTEGER, POINTER :: ZsPerm(:)
459
TYPE(Model_t) :: Model
460
TYPE(Solver_t), TARGET :: Solver
461
INTEGER :: nodenumber, NMAX, i, dim
462
REAL(KIND=dp) :: mu, Zs, t, told
463
REAL(KIND=dp), ALLOCATABLE :: Zs0(:), ZsPrev(:)
464
LOGICAL :: FirstTime=.True., NewTime=.TRUE., CalvingOccurs, &
465
RemeshOccurs, Found, Debug = .FALSE.
466
467
SAVE FirstTime, told, NewTime
468
SAVE Zs0, ZsPrev, ZsPerm, NMAX, dim
469
470
Debug = .FALSE.
471
! Real time import
472
Timevar => VariableGet( Model % Variables,'Time')
473
t = TimeVar % Values(1)
474
475
ZsSol => VariableGet( Model % Variables, 'Zs Top')
476
IF (ASSOCIATED(ZsSol)) THEN
477
ZsPerm => ZsSol % Perm
478
ELSE
479
CALL FATAL('ZsTopMZsIni','Could not find variable >Zs Top<')
480
END IF
481
482
IF (FirstTime) THEN
483
FirstTime = .False.
484
Newtime = .TRUE.
485
told = t
486
dim = CoordinateSystemDimension()
487
NMAX = COUNT( ZsPerm > 0 )
488
ALLOCATE(Zs0(NMAX),ZsPrev(NMAX))
489
DO i = 1, Model % NumberOfNodes
490
IF (ZsPerm(i)==0) CYCLE
491
IF (dim==2) THEN
492
Zs0(ZsPerm(i)) = Model % Nodes % y (i)
493
ELSE
494
Zs0(ZsPerm(i)) = Model % Nodes % z (i)
495
END IF
496
END DO
497
END IF
498
499
IF(t>told) Newtime = .TRUE.
500
501
CalvingOccurs = ListGetLogical( Model % Simulation, 'CalvingOccurs', Found)
502
IF(.NOT. Found) THEN
503
IF(Debug) CALL INFO("ZsTopMZsIni","Can't find CalvingOccurs Logical, assuming false")
504
CalvingOccurs = .FALSE.
505
END IF
506
507
RemeshOccurs = ListGetLogical( Model % Simulation, 'RemeshOccurs', Found)
508
IF(.NOT. Found) THEN
509
IF(Debug) CALL WARN("ZsTopMZsIni","Can't find RemeshCondition Logical, assuming false!")
510
RemeshOccurs = .FALSE.
511
END IF
512
513
IF(Newtime) THEN
514
PRINT *, 'USF_Zs: New time, saving previous Zs values!'
515
told = t
516
Newtime = .FALSE.
517
DO i = 1, Model % NumberOfNodes
518
IF (ZsPerm(i)==0) CYCLE
519
IF (dim==2) THEN
520
ZsPrev(ZsPerm(i)) = Model % Nodes % y (i)
521
ELSE
522
ZsPrev(ZsPerm(i)) = Model % Nodes % z (i)
523
END IF
524
END DO
525
END IF
526
527
IF(CalvingOccurs .OR. RemeshOccurs) THEN
528
Zs0 = ZsPrev
529
END IF
530
531
mu = Zs - Zs0(ZsPerm(nodenumber))
532
533
END FUNCTION ZsTopMZsIniCalving
534
535
536