Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download
Project: two
Views: 73
1
package main
2
3
import (
4
"fmt"
5
"math"
6
"myfunc"
7
"os"
8
"strconv"
9
)
10
11
//Фрагмент программы, имитирующий omf-файл. Исходная намагниченность
12
//рассчитана на сетке 128x32x256, массивы fila, turn, turn имеют
13
//размеры 126х30х254, после "прореживания" пишем в omf-файл массив
14
//с размерами 63х15х127
15
16
func main() {
17
18
var Mtrxd2 = map[int]map[int]float64{}
19
var valx = myfunc.Range(1, 256)
20
var valy = myfunc.Range(1, 256)
21
for _, i := range valx {
22
Mtrxd2[i] = make(map[int]float64)
23
for _, j := range valy {
24
Mtrxd2[i][j] = 0
25
}
26
}
27
var Mtrxd3 = map[int]map[int]map[int]float64{}
28
var valx3 = myfunc.Range(1, 256)
29
var valy3 = myfunc.Range(1, 256)
30
var valz3 = myfunc.Range(1, 64)
31
for _, i := range valx3 {
32
Mtrxd3[i] = make(map[int]map[int]float64)
33
for _, j := range valy3 {
34
Mtrxd3[i][j] = make(map[int]float64)
35
for _, k := range valz3 {
36
Mtrxd3[i][j][k] = 0
37
}
38
}
39
}
40
var Mtrxd4 = map[int]map[int]map[int]map[int]float64{}
41
var valx4 = myfunc.Range(1, 3)
42
var valy4 = myfunc.Range(1, 256)
43
var valz4 = myfunc.Range(1, 256)
44
var vall4 = myfunc.Range(1, 64)
45
for _, i := range valx4 {
46
Mtrxd4[i] = make(map[int]map[int]map[int]float64)
47
for _, j := range valy4 {
48
Mtrxd4[i][j] = make(map[int]map[int]float64)
49
for _, k := range valz4 {
50
Mtrxd4[i][j][k] = make(map[int]float64)
51
for _, l := range vall4 {
52
Mtrxd4[i][j][k][l] = 0
53
}
54
}
55
}
56
}
57
58
var dummy string
59
dig := []string{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}
60
partnum := StrTripArr()
61
62
var (
63
err error
64
newFile *os.File
65
newFile2 *os.File
66
newFile3 *os.File
67
)
68
69
var (
70
nstepx = 256 - 1
71
nstepy = 256 - 1
72
nstepz = 64 - 1
73
nstepx2 = 128 - 1
74
nstepy2 = 128 - 1
75
nstepz2 = 32 - 1
76
pi = math.Pi
77
xcsize = 3.125e-9
78
ycsize = 3.125e-9
79
zcsize = 3.125e-9
80
ind1 = 4
81
ind2 = 4
82
)
83
const (
84
nstepxa = 256 - 1
85
nstepya = 256 - 1
86
nstepza = 64 - 1
87
nstepx2a = 128 - 1
88
nstepy2a = 128 - 1
89
nstepz2a = 32 - 1
90
)
91
var (
92
gx, gy, gz, GyroSum, delta, mmgn, nrm, TurnSum, itm,
93
S1, V1, S2, V2, S3, V3, S4, V4,
94
FI1, FI2, FI3, FI4 float64
95
)
96
var (
97
coorstep = Mtrxd3
98
//h = Range(1, 3*(nstepxa+1)*(nstepya+1)*(nstepza+1))
99
// filaa = Mtrxd3
100
// homoa = Mtrxd3
101
// turna = Mtrxd3
102
mgn = Mtrxd4
103
mgnn = Mtrxd4
104
// cstep3d = Mtrxd3
105
// turn = Mtrxd3
106
fila = Mtrxd3
107
homo = Mtrxd3
108
GyroVecx = Mtrxd3
109
GyroVecy = Mtrxd3
110
GyroVecz = Mtrxd3
111
)
112
var (
113
// fnamein,
114
// fnameout,
115
// fnameout2 string
116
)
117
var (
118
nx0, ny0, nz0, nx, ny, nz, nnx, nny, nnz int
119
)
120
121
frag1 := `D:\mumax3.6.2\Labyr\inplane\IP\m00`
122
frag5 := `D:\mumax3.6.2\Labyr\inplane\IP\gyr`
123
frag4 := `D:\mumax3.6.2\Labyr\inplane\IP\fht`
124
frag6 := `D:\mumax3.6.2\Labyr\inplane\IP\mr0`
125
frag2 := `.ovf`
126
frag3 := `.omf`
127
128
for itm := 1; itm <= 61; itm++ {
129
130
fnamein := frag1 + partnum[itm] + frag2
131
f, err := os.Open("fnamein1")
132
if err != nil {
133
fmt.Println(err)
134
}
135
mgn = myfunc.LinePasteFile(f, err, mgn)
136
f.Close()
137
138
fnameout := frag6 + partnum[itm] + frag2
139
fnameout2 := frag5 + partnum[itm] + frag2
140
fnameout3 := frag4 + partnum[itm] + frag2
141
142
os.Create(fnameout)
143
newFile, err := os.OpenFile(fnameout, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600)
144
if err != nil {
145
panic(err)
146
}
147
writeText := fmt.Sprint(`# OOMMF: rectangular mesh v1.0
148
# Segment count: 1
149
# Begin: Segment
150
# Begin: Header
151
# Title: m
152
# Desc:
153
# Desc:
154
# Desc:
155
# Desc:
156
# Desc:
157
# Desc:
158
# meshtype: rectangular
159
# meshunit: m`, "\n", `# xbase: `, xcsize, "\n",
160
`# ybase: `, ycsize, "\n",
161
`# zbase: `, zcsize, "\n",
162
`# xstepsize: `, 2.*xcsize, "\n",
163
`# ystepsize: `, 2.*ycsize, "\n",
164
`# zstepsize: `, 2.*zcsize, "\n",
165
`# xnodes: `, nstepx2+1, "\n",
166
`# ynodes: `, nstepy2+1, "\n",
167
`# znodes: `, nstepz2+1, "\n",
168
`# xmin: `, 0., "\n",
169
`# ymin: `, 0., "\n",
170
`# zmin: `, 0., "\n",
171
`# xmax: `, 2.*xcsize*(float64(nstepx2+1)), "\n",
172
`# ymax: `, 2.*ycsize*(float64(nstepy2+1)), "\n",
173
`# zmax: `, 2.*zcsize*(float64(nstepz2+1)), "\n",
174
`# valueunit: A/m`, "\n",
175
`# valuemultiplier: `, 1., "\n",
176
`# ValueRangeMinMag: `, "\n",
177
`# ValueRangeMaxMag: `, "\n",
178
`# End: Header`, "\n",
179
`# Begin: Data Text`)
180
181
if _, err = newFile.WriteString(writeText); err != nil {
182
panic(err)
183
}
184
for k := 1; k <= nstepz2+1; k++ {
185
for j := 1; j <= nstepz2+1; j++ {
186
for i := 1; i <= nstepz2+1; i++ {
187
vals := fmt.Sprintf("%f %f %f", mgn[1][2*i-1][2*j-1][2*k-1], mgn[2][2*i-1][2*j-1][2*k-1], mgn[3][2*i-1][2*j-1][2*k-1])
188
newFile.WriteString(vals)
189
}
190
}
191
}
192
newFile.WriteString(`# End: Data Text
193
# End: Segment`)
194
newFile.Close()
195
196
for nz := 2; nz <= nstepz; nz++ {
197
for ny := 2; ny <= nstepy; ny++ {
198
for nx := 2; nx <= nstepx; nx++ {
199
200
fila[nx-1][ny-1][nz-1] = mgn[3][nx-1][ny-1][nz-1]
201
nx0 := 1
202
ny0 := 1
203
nz0 := 1
204
GyroVecz[nx-1][ny-1][nz-1] = gyrox(gx, nx, ny, nz, mgn)
205
GyroVecx[nx-1][ny-1][nz-1] = gyroy(gy, nx, ny, nz, mgn)
206
GyroVecy[nx-1][ny-1][nz-1] = gyroz(gz, nx, ny, nz, mgn)
207
208
GyroSum = 0
209
//1 Суммируем по граням z=delta*nz и z=delta*nz0+1:
210
for i := nx - 1; i <= nx; i++ {
211
for j := ny - 1; j < ny; j++ {
212
GyroSum -= gyroz(gz, i, j, nz-1, mgn)
213
GyroSum += gyroz(gz, i, j, nz, mgn)
214
}
215
216
}
217
218
//2 Суммируем по граням x=delta*nx0 и x=delta*nx0+1:
219
for j := ny - 1; j <= ny; j++ {
220
for k := nz - 1; k < nz; k++ {
221
GyroSum -= gyrox(gx, nx-1, j, k, mgn)
222
GyroSum += gyrox(gx, nx, j, k, mgn)
223
}
224
225
}
226
227
//3 Суммируем по граням y=delta*ny0 и y=delta*ny:
228
for i := nx - 1; i <= nx; i++ {
229
for k := ny - 1; k < ny; k++ {
230
GyroSum -= gyroy(gy, i, ny-1, k, mgn)
231
GyroSum += gyroy(gy, i, ny, k, mgn)
232
}
233
234
}
235
236
//Делим на 4п:
237
GyroSum = GyroSum / (4. * pi)
238
homo[nx-1][ny-1][nz-1] = GyroSum
239
240
}
241
}
242
}
243
244
os.Create(fnameout2)
245
newFile2, err := os.OpenFile(fnameout2, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600)
246
if err != nil {
247
panic(err)
248
}
249
writeText = fmt.Sprint(`# OOMMF: rectangular mesh v1.0
250
# Segment count: 1
251
# Begin: Segment
252
# Begin: Header
253
# Title: Gyro
254
# Desc:
255
# Desc:
256
# Desc:
257
# Desc:
258
# Desc:
259
# Desc:
260
# meshtype: rectangular
261
# meshunit: m`, "\n",
262
`# xbase: `, xcsize, "\n",
263
`# ybase: `, ycsize, "\n",
264
`# zbase: `, zcsize, "\n",
265
`# xstepsize: `, 2.*xcsize, "\n",
266
`# ystepsize: `, 2.*ycsize, "\n",
267
`# zstepsize: `, 2.*zcsize, "\n",
268
`# xnodes: `, nstepx2, "\n",
269
`# ynodes: `, nstepy2, "\n",
270
`# znodes: `, nstepz2, "\n",
271
`# xmin: `, 0., "\n",
272
`# ymin: `, 0., "\n",
273
`# zmin: `, 0., "\n",
274
`# xmax: `, 2.*xcsize*(float64(nstepx2)), "\n",
275
`# ymax: `, 2.*ycsize*(float64(nstepy2)), "\n",
276
`# zmax: `, 2.*zcsize*(float64(nstepz2)), "\n",
277
`# valueunit: A/m`, "\n",
278
`# valuemultiplier: `, 1., "\n",
279
`# ValueRangeMinMag: `, "\n",
280
`# ValueRangeMaxMag: `, "\n",
281
`# End: Header`, "\n",
282
`# Begin: Data Text`)
283
284
if _, err = newFile2.WriteString(writeText); err != nil {
285
panic(err)
286
}
287
for k := 1; k <= nstepz2; k++ {
288
for j := 1; k <= nstepz2; j++ {
289
for i := 1; k <= nstepz2; i++ {
290
vals := fmt.Sprintf("%f %f %f", GyroVecx[2*i-1][2*j-1][2*k-1], GyroVecy[2*i-1][2*j-1][2*k-1], GyroVecz[2*i-1][2*j-1][2*k-1])
291
newFile2.WriteString(vals)
292
}
293
}
294
}
295
newFile2.WriteString(`# End: Data Text
296
# End: Segment`)
297
newFile2.Close()
298
299
// //Закончили гомотопическое число, начинаем число вращения
300
// for nz := 2; nz <= nstepz; nz++ { //цикл по позициям стороны [nx->nx0,nz] контура
301
// nx0 = 1 //фиксировано: верхняя граница пленки
302
// ny0 = 1
303
// nz = 1
304
// nx = nstepx + 1
305
// ny = nstepy + 1 //меняется: положение одной из сторон прямоугольного контура
306
307
// // По данным для 3D намагниченности находятся данные для искусственно вводимой 2D
308
// // "намагниченности": проекции 3D векторов на граничную поверхность y=100нм (i=32)
309
// // каждая нормируется на единицу. Результат записывается в массив mgnn (только для
310
// // граничной поверхности!). Если проекция 3D вектора на границу равна нулю, 2D
311
// // вектор также берется нулевым: сингулярность!!!).
312
313
// for j := nx0; j <= nx; j++ {
314
// for k := ny0; k < ny; k++ {
315
// nrm = math.Sqrt(mgn[1][j][k][nz] * mgn[1][j][k][nz] * mgn[2][j][k][nz])
316
// if nrm > 0.0000001 {
317
// mgnn[1][j][k][nz] = mgn[1][j][k][nz] / nrm
318
// mgnn[2][j][k][nz] = mgn[2][j][k][nz] / nrm
319
// } else {
320
// mgnn[1][j][k][nz] = 0
321
// mgnn[2][j][k][nz] = 0
322
// }
323
// }
324
// }
325
// // Рассчитывается значение j как криволинейный интеграл по замкнутому контуру описанной
326
// // выше формы. Роль параметра играет либо x, либо z. Произведение поля и производной
327
// // поля аппроксимируются так:
328
// // Mz(dMx/dy)(ijk)=[(1/2)(Mz(ij+1k)+Mz(ijk))]*[(Mx(ij+1k)-Mx(ijk))/(шаг сетки)].
329
// // Далее при вычислении интегральной суммы каждое слагаемое будет содержать множитель
330
// // (шаг сетки). Мы сразу сократим эти множители в производной и в интегральной сумме.
331
332
// Turnsum := 0
333
// for nny := 2; nny <= nstepy; nny++ {
334
// for nnx := 2; nnx <= nstepx; nnx++ {
335
// for j := nx - 2; j <= nx; j++ {
336
// TurnSum += (mgnn[2][j+1][ny-1][nz]-mgnn[2][j][ny-1][nz])*
337
// (mgnn[1][j+1][ny-1][nz]+mgnn[1][j][ny-1][nz])/2. -
338
// (mgnn[1][j+1][ny-1][nz]-mgnn[1][j][ny-1][nz])*
339
// (mgnn[2][j+1][ny-1][nz]+mgnn[2][j][ny-1][nz])/2.
340
// }
341
342
// for k := ny - 2; k <= ny; k++ {
343
// TurnSum += (mgnn[2][nx][k+1][nz]-mgnn[2][nx][k][nz])*
344
// (mgnn[1][nx][k+1][nz]+mgnn[1][nx][k][nz])/2. -
345
// (mgnn[1][nx][k+1][nz]-mgnn[1][nx][k][nz])*
346
// (mgnn[2][nx][k+1][nz]+mgnn[2][nx][k][nz])/2.
347
// }
348
349
// for j := nx - 2; j <= nx; j++ {
350
// TurnSum += (mgnn[2][j+1][ny][nz]-mgnn[2][nx-1][ny][nz])*
351
// (mgnn[1][j+1][ny][nz]+mgnn[1][nx-1][ny][nz])/2. -
352
// (mgnn[1][j+1][ny][nz]-mgnn[1][nx-1][ny][nz])*
353
// (mgnn[2][j+1][ny][nz]+mgnn[2][nx-1][ny][nz])/2.
354
// }
355
356
// for k := ny - 2; k <= ny; k++ {
357
// TurnSum += (mgnn[2][nx-1][k+1][nz]-mgnn[2][nx-1][k][nz])*
358
// (mgnn[1][nx-1][k+1][nz]+mgnn[1][nx-1][k][nz])/2. -
359
// (mgnn[1][nx-1][k+1][nz]-mgnn[1][nx-1][k][nz])*
360
// (mgnn[2][nx-1][k+1][nz]+mgnn[2][nx-1][k][nz])/2.
361
// }
362
363
// for nn := 2; nn <= nstepy; nn++ {
364
// for nnx := nx - 1; nnx <= nx; nnx++ {
365
// V1 = mgnn[1][nnx-1][nny-1][nz]*mgnn[2][nnx][nny-1][nz] -
366
// mgnn[1][nnx][nny-1][nz]*mgnn[2][nnx-1][nny-1][nz]
367
// S1 = mgnn[1][nnx-1][nny-1][nz]*mgnn[1][nnx][nny-1][nz] +
368
// mgnn[2][nnx-1][nny-1][nz]*mgnn[2][nnx][nny-1][nz]
369
// FI1 = math.Asin(S1)
370
// TurnSum += FI1 * V1
371
// }
372
// V2 = mgnn[1][nnx][nny-1][nz]*mgnn[2][nnx][nny][nz] -
373
// mgnn[2][nnx][nny-1][nz]*mgnn[1][nnx][nny][nz]
374
// S2 = mgnn[1][nnx][nny-1][nz]*mgnn[1][nnx][nny][nz] +
375
// mgnn[2][nnx][nny][nz]*mgnn[2][nnx][nny-1][nz]
376
// FI2 = math.Acos(S2)
377
// TurnSum += FI2 * V2
378
379
// V3 = mgnn[1][nnx][nny][nz]*mgnn[2][nnx-1][nny][nz] -
380
// mgnn[2][nnx][nny][nz]*mgnn[1][nnx-1][nny][nz]
381
// S3 = mgnn[1][nnx][nny][nz]*mgnn[1][nnx-1][nny][nz] +
382
// mgnn[2][nnx][nny][nz]*mgnn[2][nnx-1][nny][nz]
383
// FI3 = math.Acos(S3)
384
// TurnSum += FI3 * V3
385
386
// V4 = mgnn[1][nnx-1][nny][nz]*mgnn[2][nnx-1][nny-1][nz] -
387
// mgnn[2][nnx-1][nny][nz]*mgnn[1][nnx-1][nny-1][nz]
388
// S4 = mgnn[1][nnx-1][nny-1][nz]*mgnn[1][nnx-1][nny][nz] +
389
// mgnn[2][nnx-1][nny-1][nz]*mgnn[2][nnx-1][nny][nz]
390
// FI4 = math.Acos(S4)
391
// TurnSum += FI4 * V4
392
// //делим на 2*pi
393
// TurnSum /= 2. * pi
394
// homoz[nx-1][ny-1][nz-1] = TurnSum //Значение числа вращения
395
396
// }
397
// }
398
// }
399
400
// // Разности
401
// for nnz := 1; nnz <= nstepz-1; nnz++ {
402
// for nny := 1; nny <= nstepy-1; nny++ {
403
// for nnx := 1; nnx < nstepx-1; nnx++ {
404
// fila[nnx][nny][nnz] = (filaa[nnx+1][nny][nnz] - filaa[nnx][nny][nnz]) *
405
// (filaa[nnx][nny+1][nnz] - filaa[nnx][nny][nnz]) *
406
// (filaa[nnx][nny][nnz+1] - filaa[nnx][nny][nnz])
407
408
// homo[nnx][nny][nnz] = (homoa[nnx+1][nny][nnz] - homoa[nnx][nny][nnz]) *
409
// (homoa[nnx][nny+1][nnz] - homoa[nnx][nny][nnz]) *
410
// (homoa[nnx][nny][nnz+1] - homoa[nnx][nny][nnz])
411
412
// turn[nnx][nny][nnz] = (turna[nnx+1][nny][nnz] - turna[nnx][nny][nnz]) *
413
// (turna[nnx][nny+1][nnz] - turna[nnx][nny][nnz]) *
414
// (turna[nnx][nny][nnz+1] - turna[nnx][nny][nnz])
415
// }
416
417
// }
418
// }
419
// }
420
421
os.Create(fnameout3)
422
newFile3, err := os.OpenFile(fnameout3, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600)
423
if err != nil {
424
panic(err)
425
}
426
writeText = fmt.Sprint(`# OOMMF: rectangular mesh v1.0
427
# Segment count: 1
428
# Begin: Segment
429
# Begin: Header
430
# Title: FiHoTu
431
# Desc:
432
# Desc:
433
# Desc:
434
# Desc:
435
# Desc:
436
# Desc:
437
# meshtype: rectangular
438
# meshunit: m`, "\n",
439
`# xbase: `, xcsize, "\n",
440
`# ybase: `, ycsize, "\n",
441
`# zbase: `, zcsize, "\n",
442
`# xstepsize: `, 2.*xcsize, "\n",
443
`# ystepsize: `, 2.*ycsize, "\n",
444
`# zstepsize: `, 2.*zcsize, "\n",
445
`# xnodes: `, nstepx2, "\n",
446
`# ynodes: `, nstepy2, "\n",
447
`# znodes: `, nstepz2, "\n",
448
`# xmin: `, 0., "\n",
449
`# ymin: `, 0., "\n",
450
`# zmin: `, 0., "\n",
451
`# xmax: `, 2.*xcsize*(float64(nstepx2)), "\n",
452
`# ymax: `, 2.*ycsize*(float64(nstepy2)), "\n",
453
`# zmax: `, 2.*zcsize*(float64(nstepz2)), "\n",
454
`# valueunit: A/m`, "\n",
455
`# valuemultiplier: `, 1., "\n",
456
`# ValueRangeMinMag: `, "\n",
457
`# ValueRangeMaxMag: `, "\n",
458
`# End: Header`, "\n",
459
`# Begin: Data Text`)
460
461
if _, err = newFile3.WriteString(writeText); err != nil {
462
panic(err)
463
}
464
for k := 1; k <= nstepz2; k++ {
465
for j := 1; k <= nstepz2; j++ {
466
for i := 1; k <= nstepz2; i++ {
467
vals := fmt.Sprintf("%f %f %f", fila[2*i-1][2*j-1][2*k-1], homo[2*i-1][2*j-1][2*k-1], GyroVecz[2*i-1][2*j-1][2*k-1])
468
newFile3.WriteString(vals)
469
}
470
}
471
}
472
newFile3.WriteString(`# End: Data Text
473
# End: Segment`)
474
newFile3.Close()
475
476
}
477
478
fmt.Println(math.Sqrt(2), nstepx, nstepy, nstepz, nstepx2, nstepy2, nstepz2, itm, dig, partnum[0], dummy,
479
nstepxa, gx, gy, gz, GyroSum, delta, mmgn, nrm, TurnSum,
480
nstepya, xcsize, ycsize, zcsize, S1, V1, S2, V2, S3, V3, S4, V4,
481
nstepza, FI1, FI2, FI3, FI4,
482
nstepx2a,
483
nstepy2a,
484
nstepz2a,
485
pi, ind1, ind2, coorstep[0], frag1,
486
)
487
}
488
489
// ErrFunc Функция ошибки
490
func ErrFunc(err error, text string) {
491
if err != nil {
492
fmt.Println(text)
493
}
494
495
}
496
497
// StrTripArr массив 001 ... 999
498
func StrTripArr() [3000]string {
499
var trip [3000]string
500
for i := 0; i <= 2999; i++ {
501
switch {
502
case i < 10:
503
trip[i] = "000" + strconv.Itoa(i)
504
case i < 100 && i > 10:
505
trip[i] = "00" + strconv.Itoa(i)
506
case i < 1000 && i > 100:
507
trip[i] = "0" + strconv.Itoa(i)
508
case i > 1000:
509
trip[i] = strconv.Itoa(i)
510
}
511
}
512
return trip
513
}
514
515
// ФУНКЦИИ для расчета компонент плотности гиротропного вектора по
516
// данным о значениях намагниченности на сетке. Производные представлены
517
// конечно-разностными аппроксимациями; при этом квадраты шага сетки
518
// опущены (т.е. gx = (х-комп. гир. век.)*(шаг сетки)^2 ).
519
func gyrox(gx float64, i int, j int, k int, mgn map[int]map[int]map[int]map[int]float64) float64 {
520
if math.Abs(mgn[3][i][j][k]) > 0.57 {
521
gx = ((mgn[2][i][j+1][k] - mgn[2][i][j][k]) * (mgn[1][i][j][k+1] - mgn[1][i][j][k])) -
522
(mgn[2][i][j][k+1]-mgn[2][i][j][k])*(mgn[1][i][j+1][k]-mgn[1][i][j][k])/
523
mgn[3][i][j][k]
524
525
} else if math.Abs(mgn[1][i][j][k]) > 0.57 {
526
gx = ((mgn[3][i][j+1][k] - mgn[3][i][j][k]) * (mgn[2][i][j][k+1] - mgn[2][i][j][k])) -
527
(mgn[3][i][j][k+1]-mgn[3][i][j][k])*(mgn[2][i][j+1][k]-mgn[2][i][j][k])/
528
mgn[1][i][j][k]
529
} else {
530
gx = ((mgn[1][i][j+1][k] - mgn[1][i][j][k]) * (mgn[3][i][j][k+1] - mgn[3][i][j][k])) -
531
(mgn[1][i][j][k+1]-mgn[1][i][j][k])*(mgn[3][i][j+1][k]-mgn[3][i][j][k])/
532
mgn[2][i][j][k]
533
}
534
return gx
535
}
536
537
func gyroy(gy float64, i int, j int, k int, mgn map[int]map[int]map[int]map[int]float64) float64 {
538
if math.Abs(mgn[3][i][j][k]) > 0.57 {
539
gy = ((mgn[2][i][j][k+1] - mgn[2][i][j][k]) * (mgn[1][i+1][j][k] - mgn[1][i][j][k])) -
540
(mgn[2][i+1][j][k]-mgn[2][i][j][k])*(mgn[1][i][j][k+1]-mgn[1][i][j][k])/
541
mgn[3][i][j][k]
542
543
} else if math.Abs(mgn[1][i][j][k]) > 0.57 {
544
gy = ((mgn[3][i][j][k+1] - mgn[3][i][j][k]) * (mgn[2][i+1][j][k] - mgn[2][i][j][k])) -
545
(mgn[3][i+1][j][k]-mgn[3][i][j][k])*(mgn[2][i][j][k+1]-mgn[2][i][j][k])/
546
mgn[1][i][j][k]
547
} else {
548
gy = ((mgn[1][i][j][k+1] - mgn[1][i][j][k]) * (mgn[3][i+1][j][k] - mgn[3][i][j][k])) -
549
(mgn[1][i+1][j][k]-mgn[1][i][j][k])*(mgn[3][i][j][k+1]-mgn[3][i][j][k])/
550
mgn[2][i][j][k]
551
}
552
return gy
553
}
554
555
func gyroz(gz float64, i int, j int, k int, mgn map[int]map[int]map[int]map[int]float64) float64 {
556
if math.Abs(mgn[3][i][j][k]) > 0.57 {
557
gz = ((mgn[2][i+1][j][k] - mgn[2][i][j][k]) * (mgn[1][i][j+1][k] - mgn[1][i][j][k])) -
558
(mgn[2][i][j+1][k]-mgn[2][i][j][k])*(mgn[1][i+1][j][k]-mgn[1][i][j][k])/
559
mgn[3][i][j][k]
560
561
} else if math.Abs(mgn[1][i][j][k]) > 0.57 {
562
gz = ((mgn[3][i][j][k+1] - mgn[3][i][j][k]) * (mgn[2][i+1][j][k] - mgn[2][i][j][k])) -
563
(mgn[3][i+1][j][k]-mgn[3][i][j][k])*(mgn[2][i][j][k+1]-mgn[2][i][j][k])/
564
mgn[1][i][j][k]
565
} else {
566
gz = ((mgn[1][i+1][j][k] - mgn[1][i][j][k]) * (mgn[3][i][j+1][k] - mgn[3][i][j][k])) -
567
(mgn[1][i][j+1][k+1]-mgn[1][i][j][k])*(mgn[3][i+1][j+1][k]-mgn[3][i][j][k])/
568
mgn[2][i][j][k]
569
}
570
return gz
571
}
572
573