Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/fem/tests/1sttime/Source.f90
5253 views
1
FUNCTION Source( Model, n, f ) RESULT(h)
2
USE Lists
3
TYPE(Model_t) :: Model
4
INTEGER :: n
5
REAL(KIND=dp) :: f, h, x, s, Time, OldTime = 0
6
7
INTEGER :: i, Case = 1
8
TYPE(Variable_t), POINTER :: T, P
9
10
T => VariableGet( Model % Variables, 'Time' )
11
Time = T % Values(1)
12
P => VariableGet( Model % Variables, 'Potential' )
13
14
! First check the previous result
15
! -------------------------------
16
IF ( Time > OldTime + 1 + 1.0d-8 ) THEN
17
OldTime = FLOOR( Time )
18
x = Model % Nodes % x(1)
19
s = P % Values( P % Perm(1) )
20
SELECT CASE(Case)
21
CASE(1) ! can we solve straight line
22
IF ( ABS(f-1.0d0) > 1.0d-10 ) &
23
CALL Fatal( 'Source', 'Not able to integrate straight line ?' )
24
Model % Solver % Matrix % Force = 0.0d0
25
P % Values = 0.0d0
26
P % PrevValues(:,:) = 0.0d0
27
CASE(2) ! how about a parabola ?
28
IF ( ABS(s-0.5d0) > 1.0d-6 ) &
29
CALL Fatal( 'Source', 'Not able to integrate parabola ?' )
30
Model % Solver % Matrix % Force = 0.0d0
31
P % Values = 0.0d0
32
P % PrevValues(:,:) = 0.0d0
33
CASE(3) ! how about a sine
34
IF ( ABS(s-sin(1.0d0)) > 1.0d-3 ) &
35
CALL Fatal( 'Source', 'Not able to integrate sine?' )
36
END SELECT
37
Case = Case + 1
38
END IF
39
40
Time = Time - FLOOR(Time)
41
IF ( ABS(Time) < 1.0d-8 ) Time = 1
42
43
! Then define new one
44
! -------------------
45
SELECT CASE(Case)
46
CASE(1) ! how about a parabola ?
47
h = 1
48
CASE(2) ! how about a third degree polynomial
49
h = Time
50
CASE(3) ! how about a sine
51
h = cos(Time)
52
CASE(4) ! how about a sine
53
h = 0.0d0
54
END SELECT
55
END FUNCTION Source
56
57