-
Notifications
You must be signed in to change notification settings - Fork 3
/
make_example.F90
144 lines (123 loc) · 3.55 KB
/
make_example.F90
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
program main
implicit none
! Output parameters
character(*), parameter :: solver = "implicit"
integer :: pdim, guess, nels, nnds, nmats, nceqs, nfrcs
integer :: ntrcts, nbcs
real(8) :: total_time, dt
integer :: obsolete_output_freq, writeType
integer, allocatable :: elements(:, :)
real(8), allocatable :: coords(:, :)
real(8), allocatable :: mats(:, :)
integer, allocatable :: bc_nodes(:, :)
real(8), allocatable :: bc_vals(:, :)
integer, allocatable :: force_nodes(:)
real(8), allocatable :: forces(:, :)
! Calculation parameters
integer :: x_nels, y_nels, x_nnds, y_nnds
! Iterators
integer :: i, j
real(8) :: current_x
real(8) :: current_y
! Convenience identifiers
integer :: bc_0_node, bc_1_node, force_0_node, force_1_node
! Input buffers
character(32) :: buffer
pdim = 2
x_nels = 10
y_nels = 1
if(iargc() == 2) then
call getarg(1, buffer)
read(buffer, '(I10)'), x_nels
call getarg(2, buffer)
read(buffer, '(I10)'), y_nels
end if
x_nnds = x_nels + 1
y_nnds = y_nels + 1
guess = x_nels * y_nels
nels = x_nels * y_nels
nnds = x_nnds * y_nnds
nmats = 1
nceqs = 0 ! Not supported yet
nfrcs = 2
ntrcts = 0 ! Not supported yet
nbcs = 2
total_time = 0.01
dt = 0.01
obsolete_output_freq = 1
writeType = 1
!! Set the elements
allocate(elements(nels, 5))
elements(:, 5) = 1 ! Set the element material
do i = 1, y_nels
do j = 1, x_nels
elements((i-1)*x_nels+j,1:4)=(/j + (i-1)*x_nnds, &
j + 1 +(i-1)*x_nnds, &
j + 1 + i*x_nnds, &
j + i*x_nnds &
/)
end do
end do
!! Elements set
!! Set the coordinates
bc_0_node = 1
bc_1_node = 1 + (y_nnds - 1) * x_nnds
allocate(coords(nnds, pdim))
do i = 1, y_nnds
current_y = (i - 1) * 1.0
do j = 1, x_nnds
current_x = (j - 1) * 1.0
coords(j + (i - 1)*x_nnds, :) = (/current_x, current_y/)
end do
end do
!! Coordinates set
!! Set materials
allocate(mats(nmats, 5))
do i = 1, nmats
mats(i, :) = (/3.0E10, 0.25, 1.0E18, 1.0, 3000.0/)
end do
!! Materials set
!! Set bcs
allocate(bc_nodes(2, pdim + 1), bc_vals(2, 2))
bc_nodes(1, :) = (/bc_0_node, 0, 0/)
bc_nodes(2, :) = (/bc_1_node, 0, 0/)
bc_vals = 0.0
!! Bcs set
!! Set forces
force_0_node = x_nnds
force_1_node = x_nnds * y_nnds
allocate(force_nodes(2), forces(2, 4))
force_nodes = (/force_0_node, force_1_node/)
forces(:, 1) = -10.0E10
forces(:, 2) = 0.0
forces(:, 3) = 0.0
forces(:, 4) = total_time
!! Forces set
open(10, file="examples/generated_example.inp", status='replace')
write(10, '(A,I0,1X,I0)'), solver // " ", pdim, guess
write(10, '(7(I0,1X))'), nels, nnds, nmats, nceqs, nfrcs, ntrcts, nbcs
write(10, '((2(F0.6,1X))(2(I0,1X)))'), total_time, dt, obsolete_output_freq, writeType
write(10, '()')
do i = 1, nels
write(10, '((A)5(I0,1X))'), "qua ", elements(i, :)
end do
write(10, '()')
do i = 1, nnds
write(10, '(2(F0.6,1X))'), coords(i, :)
end do
write(10, '()')
do i = 1, nmats
write(10, '(5(F0.6,1X))'), mats(i, :)
end do
write(10, '()')
do i = 1, nbcs
write(10, '(3(I0,1X)2(F0.6,1X))'), bc_nodes(i,:), bc_vals(i, :)
end do
write(10, '()')
do i = 1, nfrcs
write(10, '((I0,1X)4(F0.6,1X))'), force_nodes(i), forces(i, :)
end do
close(10)
deallocate(elements, coords, mats, bc_nodes, bc_vals)
deallocate(force_nodes, forces)
end program main