DNDSR 0.1.0.dev1+gcd065ad
Distributed Numeric Data Structure for CFV
Loading...
Searching...
No Matches
test_cfv_dissdisp.py
Go to the documentation of this file.
1import DNDSR
2
3# print(DNDSR.__dict__)
4
5from DNDSR import DNDS, Geom, CFV
6from DNDSR.Geom.utils import *
7import numpy as np
8import json
9
10# vfvSettings = json.loads(
11# "".join(
12# [
13# line if not line.strip().startswith("//") else ""
14# for line in """{
15# "maxOrder": 3,
16# "intOrder": 5,
17# "intOrderVR": 5,
18# "cacheDiffBase": true,
19# "jacobiRelax": 1,
20# "SORInstead": false,
21# "smoothThreshold": 1e-3,
22# "WBAP_nStd": 10.0,
23# "normWBAP": false,
24# "subs2ndOrder": 1,
25# "subs2ndOrderGGScheme": 0,
26# "baseSettings": {
27# "localOrientation": false,
28# "anisotropicLengths": false
29# },
30# "functionalSettings": {
31# // "scaleType": "MeanAACBB",
32# "dirWeightScheme": "HQM_OPT",
33# // "dirWeightScheme": "ManualDirWeight",
34# // "manualDirWeights": [
35# // 1.0,
36# // 1,
37# // 0,
38# // 0
39# // ],
40# "geomWeightScheme": "HQM_SD",
41# "geomWeightPower": 0.5,
42# "geomWeightBias": 1,
43# // "geomWeightScheme": "SD_Power",
44# // "geomWeightPower1": -0.5,
45# // "geomWeightPower2": 0.5,
46# // "useAnisotropicFunctional": true,
47# // // "anisotropicType": "InertiaCoordBB",
48# // "inertiaWeightPower": 0,
49# // "scaleMultiplier": 1,
50# "_tail": 0
51# }
52# }
53# """.splitlines()
54# ]
55# )
56# )
57# print(vfvSettings)
58
59
61 return {
62 "maxOrder": 3,
63 "intOrder": 5,
64 "intOrderVR": 5,
65 "cacheDiffBase": True,
66 "jacobiRelax": 1,
67 "SORInstead": False,
68 "smoothThreshold": 0.001,
69 "WBAP_nStd": 10.0,
70 "normWBAP": False,
71 "subs2ndOrder": 1,
72 "subs2ndOrderGGScheme": 0,
73 "baseSettings": {"localOrientation": False, "anisotropicLengths": False},
74 "functionalSettings": {
75 "dirWeightScheme": "HQM_OPT",
76 "geomWeightScheme": "HQM_SD",
77 "geomWeightPower": 0.5,
78 "geomWeightBias": 1,
79 "_tail": 0,
80 },
81 }
82
83
85
87 self,
88 mpi,
89 vfvSettings=default_VRSettings(),
90 ax=1.0,
91 ay=0.0,
92 sigma=0.0,
93 AR=1.0,
94 ob=0.0,
95 batch_size=1,
96 ):
97 self.batch_size = batch_size
98 self.mpi = mpi
99 self.ax = ax
100 self.ay = ay
101 self.sigma = sigma
102
103 meshFile = os.path.join(
104 os.path.dirname(__file__),
105 "..",
106 "..",
107 "data",
108 "mesh",
109 "Uniform_5x5_wave.cgns",
110 )
111
112 transform = np.array(
113 [
114 [1, 0, 0],
115 [0, 1.0 / AR, 0],
116 [0, 0, 1],
117 ],
118 dtype=np.float64,
119 )
120 transform = (
121 np.array(
122 [
123 [1, ob, 0],
124 [0, 1, 0],
125 [0, 0, 1],
126 ],
127 dtype=np.float64,
128 )
129 @ transform
130 )
131
132 mesh, reader, name2Id = create_mesh_from_CGNS(
133 meshFile,
134 mpi,
135 2,
136 periodic_geometry={
137 "translation1": [5, 0, 0],
138 "translation2": [0, 5, 0],
139 },
140 )
141 mesh.SetPeriodicGeometry(
142 translation1=transform @ np.array([5, 0, 0]),
143 translation2=transform @ np.array([0, 5, 0]),
144 )
145 coord_father = np.array(mesh.coords.father.data(), copy=False).reshape(-1, 3)
146 coord_son = np.array(mesh.coords.son.data(), copy=False).reshape(-1, 3)
147
148 coord_father[:] = coord_father @ transform.transpose()
149 coord_son[:] = coord_son @ transform.transpose()
150
151 meshBnd, readerBnd = create_bnd_mesh(mesh)
152
153 self.reader = reader
154 self.name2Id = name2Id
155 self.meshBnd = meshBnd
156 self.readerBnd = readerBnd
157
158 vfv = CFV.VariationalReconstruction_2(mpi, mesh)
159 self.vfvSettings = vfvSettings
160 vfv.ParseSettings(vfvSettings)
161 vfv.SetPeriodicTransformationsNoOp()
162
163 bcid_2_bcweight_map = {}
164 for name, id in name2Id.n2id_map.items():
165 # if name == "WALL":
166 bcid_2_bcweight_map[(id, 0)] = 1.0
167 if name.startswith("PERIODIC"):
168 bcid_2_bcweight_map[(id, 0)] = 1.0
169 bcid_2_bcweight_map[(id, 1)] = 1.0
170 bcid_2_bcweight_map[(id, 2)] = 1.0
171 bcid_2_bcweight_map[(id, 3)] = 1.0
172 vfv.ConstructMetrics()
173 vfv.ConstructBaseAndWeight_map(bcid_2_bcweight_map)
174 vfv.ConstructRecCoeff()
175
176 self.mesh = mesh
177 self.vfv = vfv
178 self.eval = CFV.ModelEvaluator(
179 mesh, vfv, {"ax": ax, "ay": ay, "sigma": sigma}, batch_size
180 )
181
182 u_real, rhs_real = [CFV.tUDof_D() for _ in range(2)]
183 uRec_real, uRecNew_real = [CFV.tURec_D() for _ in range(2)]
184 u_imag, rhs_imag = [CFV.tUDof_D() for _ in range(2)]
185 uRec_imag, uRecNew_imag = [CFV.tURec_D() for _ in range(2)]
186 self.u_list = [u_real, rhs_real, u_imag, rhs_imag]
187 self.uRec_list = [uRec_real, uRecNew_real, uRec_imag, uRecNew_imag]
188
189 for u_ in self.u_list:
190 vfv.BuildUDof_D(u_, batch_size)
191 for uRec_ in self.uRec_list:
192 vfv.BuildURec_D(uRec_, batch_size)
193
194 nFree = 0
195 for iCell in range(mesh.NumCell()):
196 if (
197 np.linalg.norm(
198 vfv.GetCellBary(iCell).flatten()
199 - transform @ np.array([0.5, 0.5, 0])
200 )
201 < 1e-10
202 ):
203 self.iCellFree = iCell
204 nFree += 1
205 if not nFree == 1:
206 raise ValueError("nFree not 1")
207
208 def update_vfv_settings(self, vfvSettings):
209 mpi = self.mpi
210 vfv = self.vfv
211 mesh = self.mesh
212 eval = self.eval
213 name2Id = self.name2Id
214 vfv.ParseSettings(vfvSettings)
215 vfv.SetPeriodicTransformationsNoOp()
216
217 bcid_2_bcweight_map = {}
218 for name, id in name2Id.n2id_map.items():
219 # if name == "WALL":
220 bcid_2_bcweight_map[(id, 0)] = 1.0
221 if name.startswith("PERIODIC"):
222 bcid_2_bcweight_map[(id, 0)] = 1.0
223 bcid_2_bcweight_map[(id, 1)] = 1.0
224 bcid_2_bcweight_map[(id, 2)] = 1.0
225 bcid_2_bcweight_map[(id, 3)] = 1.0
226 vfv.ConstructMetrics()
227 vfv.ConstructBaseAndWeight_map(bcid_2_bcweight_map)
228 vfv.ConstructRecCoeff()
229
230 def update_eval_settings(self, ax=1.0, ay=0, sigma=0.0):
231 self.ax = ax
232 self.ay = ay
233 self.sigma = sigma
234 self.eval.ParseSettings({"ax": ax, "ay": ay, "sigma": sigma})
235
237 u_real, rhs_real, u_imag, rhs_imag = self.u_list
238 return np.array(rhs_real[self.iCellFree]) + 1j * np.array(
239 rhs_imag[self.iCellFree]
240 )
241
243 u_real, rhs_real, u_imag, rhs_imag = self.u_list
244 return np.array(u_real[self.iCellFree]) + 1j * np.array(u_imag[self.iCellFree])
245
246 def set_uFree(self, r: np.ndarray, i: np.ndarray):
247 u_real, rhs_real, u_imag, rhs_imag = self.u_list
248 np.array(u_real[self.iCellFree], copy=False)[:] = r
249 np.array(u_imag[self.iCellFree], copy=False)[:] = i
250
252 self,
253 kx: np.ndarray,
254 ky: np.ndarray,
255 n_iter=10000,
256 tol=1e-15,
257 n_print=0,
258 n_iter_min=1,
259 u_free=1 + 0j,
260 rhsOptions=CFV.ModelEvaluator.EvaluateRHSOptions(),
261 ):
262 if kx.size != self.batch_size or ky.size != self.batch_size:
263 raise ValueError("input k size not right")
264
265 kx = kx.flatten()
266 ky = ky.flatten()
267 vfv = self.vfv
268 mesh = self.mesh
269 eval = self.eval
270
271 u_real, rhs_real, u_imag, rhs_imag = self.u_list
272 uRec_real, uRecNew_real, uRec_imag, uRecNew_imag = self.uRec_list
273
274 self.set_uFree(u_free.real, u_free.imag)
275 self.uSync(kx, ky)
276
277 self.DoReconstruction(kx, ky, n_iter, tol, n_print, n_iter_min=n_iter_min)
278
279 eval.EvaluateRHS(rhs_real, u_real, uRec_real, 0.0, options=rhsOptions)
280 eval.EvaluateRHS(rhs_imag, u_imag, uRec_imag, 0.0, options=rhsOptions)
281 return (
282 np.array(rhs_real[self.iCellFree]) + 1j * np.array(rhs_imag[self.iCellFree])
283 ).flatten()
284
286 self,
287 dTau=10,
288 dT=1e100,
289 kx: np.ndarray = np.array([0]),
290 ky: np.ndarray = np.array([0]),
291 n_iter=10000,
292 tol=1e-15,
293 n_print=0,
294 n_iter_min=1,
295 singlegrid_niter=1,
296 multigrid_niters=(0, 0),
297 use_diff_Jacobi=False,
298 top_override=-1,
299 multigrid_res_fact=(1.0, 1.0),
300 multigrid_dtau_fact=(1.0, 1.0),
301 ):
302 if kx.size != self.batch_size or ky.size != self.batch_size:
303 raise ValueError("input k size not right")
304
305 kx = kx.flatten()
306 ky = ky.flatten()
307
308 vfv = self.vfv
309 mesh = self.mesh
310 eval = self.eval
311
312 u_real, rhs_real, u_imag, rhs_imag = self.u_list
313 uRec_real, uRecNew_real, uRec_imag, uRecNew_imag = self.uRec_list
314
315 rhsParamsGeneral = {
316 "n_iter": n_iter,
317 "tol": tol,
318 "n_print": n_print,
319 "n_iter_min": n_iter_min,
320 }
321 rhsOptionsTop = eval.EvaluateRHSOptions()
322 if top_override == 1:
323 rhsOptionsTop.direct2ndRec = True
324 rhsOptionsTop.direct2ndRec1stConv = False
325 if top_override == 0:
326 rhsOptionsTop.direct2ndRec = True
327 rhsOptionsTop.direct2ndRec1stConv = True
328
329 # build the fv jacobian
330 J = np.complex128(0)
331 c2f = np.array(mesh.cell2face[self.iCellFree])
332 xcC = vfv.GetCellBary(self.iCellFree)
333
334 for ic2f, iFace in enumerate(c2f):
335 iCellOther = mesh.CellFaceOther(self.iCellFree, iFace)
336 assert iCellOther != DNDS.UnInitIndex
337 normOut = vfv.GetFaceNormFromCell(iFace, self.iCellFree, -1, -1)
338 if not mesh.CellIsFaceBack(self.iCellFree, iFace):
339 normOut *= -1.0
340 a_out = normOut[0] * self.ax + normOut[1] * self.ay
341
342 a_vis = (
343 self.sigma
344 * vfv.GetFaceArea(iFace)
345 * (
346 1.0 / vfv.GetCellVol(self.iCellFree)
347 + 1.0 / vfv.GetCellVol(iCellOther)
348 )
349 )
350
351 xcr = vfv.GetCellBary(iCellOther) - xcC
352 wave_val = np.exp(1j * (kx * xcr[0] + ky * xcr[1])).reshape(-1, 1)
353 dFdu = (1 + wave_val) * 0.5 * a_out - 0.5 * np.abs(a_out) * (wave_val - 1)
354 dFdu += -0.5 * a_vis * (wave_val - 1)
355
356 J -= dFdu * vfv.GetFaceArea(iFace) / vfv.GetCellVol(self.iCellFree)
357
358 if use_diff_Jacobi:
359 eps = 1e-6
360 J_top = (
361 self.test_one_wave(
362 kx,
363 ky,
364 rhsOptions=rhsOptionsTop,
365 **rhsParamsGeneral,
366 )
367 - self.test_one_wave(
368 kx,
369 ky,
370 rhsOptions=rhsOptionsTop,
371 u_free=0j + 1 - eps,
372 **rhsParamsGeneral,
373 )
374 ) / eps
375 else:
376 J_top = J
377
378 if use_diff_Jacobi:
379 eps = 1e-6
380 options = eval.EvaluateRHSOptions()
381 options.direct2ndRec = True
382 options.direct2ndRec1stConv = False
383 J_p1 = (
384 self.test_one_wave(kx, ky, rhsOptions=options, **rhsParamsGeneral)
385 - self.test_one_wave(
386 kx, ky, u_free=0j + 1 - eps, rhsOptions=options, **rhsParamsGeneral
387 )
388 ) / eps
389 else:
390 J_p1 = J
391
392 np.array(u_real[self.iCellFree], copy=False)[:] = 1
393 np.array(u_imag[self.iCellFree], copy=False)[:] = 0
394 self.uSync(kx, ky)
395
396 ################# OTop
397
398 for iter in range(singlegrid_niter):
399 self.DoReconstruction(kx, ky, n_iter, tol, n_print, n_iter_min=n_iter_min)
400 eval.EvaluateRHS(rhs_real, u_real, uRec_real, 0.0, options=rhsOptionsTop)
401 eval.EvaluateRHS(rhs_imag, u_imag, uRec_imag, 0.0, options=rhsOptionsTop)
402
403 uFreeNew = self.get_uFreeComplex() + (
404 self.get_rhsFreeComplex() - self.get_uFreeComplex() / dT
405 ) / (-J_top + 1.0 / (dTau * 1.0) + 1.0 / dT)
406 self.set_uFree(np.real(uFreeNew), np.imag(uFreeNew))
407 self.uSync(kx, ky)
408
409 self.DoReconstruction(kx, ky, n_iter, tol, n_print, n_iter_min=n_iter_min)
410 eval.EvaluateRHS(rhs_real, u_real, uRec_real, 0.0, options=rhsOptionsTop)
411 eval.EvaluateRHS(rhs_imag, u_imag, uRec_imag, 0.0, options=rhsOptionsTop)
412 rhs_top = self.get_rhsFreeComplex() - self.get_uFreeComplex() / dT
413
414 ################# O1
415
416 options1 = eval.EvaluateRHSOptions()
417 options1.direct2ndRec = True
418 options1.direct2ndRec1stConv = False
419 rhs1_init = None
420 # not need reconstruction
421 # self.DoReconstruction(kx, ky, n_iter, tol, n_print, n_iter_min=n_iter_min)
422 eval.EvaluateRHS(rhs_real, u_real, uRec_real, 0.0, options=options1)
423 eval.EvaluateRHS(rhs_imag, u_imag, uRec_imag, 0.0, options=options1)
424 rhs1_init = self.get_rhsFreeComplex() - self.get_uFreeComplex() / dT
425 for iter in range(multigrid_niters[0]):
426 uFreeNew = self.get_uFreeComplex() + (
427 self.get_rhsFreeComplex()
428 - self.get_uFreeComplex() / dT
429 - rhs1_init
430 + rhs_top * multigrid_res_fact[0]
431 ) / (-J_p1 + 1.0 / (dTau * multigrid_dtau_fact[0]) + 1.0 / dT)
432 self.set_uFree(np.real(uFreeNew), np.imag(uFreeNew))
433 self.uSync(kx, ky)
434 eval.EvaluateRHS(rhs_real, u_real, uRec_real, 0.0, options=options1)
435 eval.EvaluateRHS(rhs_imag, u_imag, uRec_imag, 0.0, options=options1)
436 rhs_1 = (
437 self.get_rhsFreeComplex()
438 - self.get_uFreeComplex() / dT
439 - rhs1_init
440 + rhs_top * multigrid_res_fact[0]
441 )
442
443 ################# O0
444
445 options0 = eval.EvaluateRHSOptions()
446 options0.direct2ndRec = True
447 options0.direct2ndRec1stConv = True
448 rhs0_init = None
449 # not need reconstruction
450 # self.DoReconstruction(kx, ky, n_iter, tol, n_print, n_iter_min=n_iter_min)
451 eval.EvaluateRHS(rhs_real, u_real, uRec_real, 0.0, options=options0)
452 eval.EvaluateRHS(rhs_imag, u_imag, uRec_imag, 0.0, options=options0)
453 rhs0_init = self.get_rhsFreeComplex() - self.get_uFreeComplex() / dT
454 for iter in range(multigrid_niters[1]):
455 uFreeNew = self.get_uFreeComplex() + (
456 self.get_rhsFreeComplex()
457 - self.get_uFreeComplex() / dT
458 - rhs0_init
459 + rhs_1 * multigrid_res_fact[1]
460 ) / (-J + 1.0 / (dTau * multigrid_dtau_fact[1]) + 1.0 / dT)
461 self.set_uFree(np.real(uFreeNew), np.imag(uFreeNew))
462 self.uSync(kx, ky)
463 eval.EvaluateRHS(rhs_real, u_real, uRec_real, 0.0, options=options0)
464 eval.EvaluateRHS(rhs_imag, u_imag, uRec_imag, 0.0, options=options0)
465
466 return self.get_uFreeComplex().flatten()
467
468 def uRecSync(self, kx: np.ndarray, ky: np.ndarray):
469 vfv = self.vfv
470 uRec_real, uRecNew_real, uRec_imag, uRecNew_imag = self.uRec_list
471 for iCell in range(self.mesh.NumCell()):
472 if iCell == self.iCellFree:
473 continue
474 xc = vfv.GetCellBary(iCell)
475 xcr = xc - vfv.GetCellBary(self.iCellFree)
476 wave_val = np.exp(1j * (kx * xcr[0] + ky * xcr[1]))
477 wave_val = wave_val.reshape(1, -1)
478 # fmt: off
479 np.array(uRec_real[iCell], copy=False)[:] = \
480 np.array(uRec_real[self.iCellFree]) * np.real(wave_val) - \
481 np.array(uRec_imag[self.iCellFree]) * np.imag(wave_val)
482 np.array(uRec_imag[iCell], copy=False)[:] = \
483 np.array(uRec_imag[self.iCellFree]) * np.real(wave_val) + \
484 np.array(uRec_real[self.iCellFree]) * np.imag(wave_val)
485 # fmt: on
486
487 def uSync(self, kx: np.ndarray, ky: np.ndarray):
488 vfv = self.vfv
489 u_real, rhs_real, u_imag, rhs_imag = self.u_list
490 for iCell in range(self.mesh.NumCell()):
491 if iCell == self.iCellFree:
492 continue
493 xc = vfv.GetCellBary(iCell)
494 xcr = xc - vfv.GetCellBary(self.iCellFree)
495 wave_val = np.exp(1j * (kx * xcr[0] + ky * xcr[1])).reshape(-1, 1)
496 # fmt: off
497 np.array(u_real[iCell], copy=False)[:] = \
498 np.array(u_real[self.iCellFree]) * np.real(wave_val) - \
499 np.array(u_imag[self.iCellFree]) * np.imag(wave_val)
500 np.array(u_imag[iCell], copy=False)[:] = \
501 np.array(u_imag[self.iCellFree]) * np.real(wave_val) + \
502 np.array(u_real[self.iCellFree]) * np.imag(wave_val)
503 # fmt: on
504
506 self, kx, ky, n_iter=10000, tol=1e-15, n_print=0, n_iter_min=1
507 ):
508 vfv = self.vfv
509 mesh = self.mesh
510 eval = self.eval
511 u_real, rhs_real, u_imag, rhs_imag = self.u_list
512 uRec_real, uRecNew_real, uRec_imag, uRecNew_imag = self.uRec_list
513
514 # print(vfv)
515
516 if self.vfvSettings["subs2ndOrder"] == 0 or self.vfvSettings["maxOrder"] > 1:
517 # use matrices:
518 c2f = np.array(mesh.cell2face[self.iCellFree])
519 matrixAAInvB = vfv.matrixAAInvB
520 vectorAInvB = vfv.vectorAInvB
521 AInv = np.array(matrixAAInvB[self.iCellFree, 0])
522 # print(AInv)
523 M, N = AInv.shape
524 assert M == N
525 MatC = np.eye(M, M, dtype=np.complex128)
526 MatC = np.repeat(MatC[np.newaxis, :, :], self.batch_size, axis=0)
527 RhsC = np.zeros((self.batch_size, M, 1), dtype=np.complex128)
528 xcC = vfv.GetCellBary(self.iCellFree)
529 uC = np.array(u_real[self.iCellFree]) + 1j * np.array(
530 u_imag[self.iCellFree]
531 )
532
533 for ic2f, iFace in enumerate(c2f):
534 iCellOther = mesh.CellFaceOther(self.iCellFree, iFace)
535 xcr = vfv.GetCellBary(iCellOther) - xcC
536 wave_val = np.exp(1j * (kx * xcr[0] + ky * xcr[1]))
537 # print(np.array(matrixAAInvB[self.iCellFree, ic2f + 2], copy=False))
538 # fmt: off
539 MatC -= (
540 wave_val[:, np.newaxis, np.newaxis]
541 * np.array(matrixAAInvB[self.iCellFree, ic2f + 1], copy=False)[np.newaxis, :, :]
542 )
543 # fmt: on
544 uOther = np.array(u_real[iCellOther]) + 1j * np.array(
545 u_imag[iCellOther]
546 )
547 RhsC += (uOther - uC)[:, :, np.newaxis] * np.array(
548 vectorAInvB[self.iCellFree, ic2f], copy=False
549 )[np.newaxis, :, :]
550 # print(np.linalg.eig(MatC))
551 uRecFree = np.linalg.solve(MatC, RhsC)
552 # fmt: off
553 np.array(uRec_real[self.iCellFree], copy=False)[:] = np.real(uRecFree).reshape(-1, M).T
554 np.array(uRec_imag[self.iCellFree], copy=False)[:] = np.imag(uRecFree).reshape(-1, M).T
555 # fmt: on
556 self.uRecSync(kx, ky)
557 return
558
559 for iCell in range(self.mesh.NumCell()):
560 np.array(uRec_real[iCell], copy=False)[:] = 0.0
561 np.array(uRec_imag[iCell], copy=False)[:] = 0.0
562 # print(f"=== Cell {iCell}")
563 # print(xcr)
564 # print(wave_val)
565 # print(u_real[iCell].tolist())
566 # print(u_imag[iCell].tolist())
567
568 for iter in range(1, 1 + n_iter):
569 uRecPrevFree = np.array(
570 (
571 np.array(uRec_real[self.iCellFree]),
572 np.array(uRec_imag[self.iCellFree]),
573 )
574 )
575 eval.DoReconstructionIter(uRec_real, uRecNew_real, u_real, 0.0, False)
576 eval.DoReconstructionIter(uRec_imag, uRecNew_imag, u_imag, 0.0, False)
577 self.uRecSync(kx, ky)
578 uRecNewFree = np.array(
579 (
580 np.array(uRec_real[self.iCellFree]),
581 np.array(uRec_imag[self.iCellFree]),
582 )
583 )
584 # print((uRecPrevFree - uRecNewFree).reshape((2, 9)))
585 incNorm = np.linalg.norm((uRecPrevFree - uRecNewFree).flatten(), ord=1)
586
587 if iter >= n_iter_min and n_print > 0 and iter % n_print == 0:
588 print(f"iter {iter} [{incNorm}]")
589 if incNorm < tol:
590 break
591
592 # print(np.array(uRec_real[self.iCellFree]).flatten())
593 # print(np.real(uRecFree).flatten())
594
595
596def test():
597 print(CFV.tUDof_1)
598 # CFV.VariationalReconstruction_2()
599
600 mpi = DNDS.MPIInfo()
601 mpi.setWorld()
602 tester = WaveTester(mpi, batch_size=3)
603 # print(
604 # tester.test_one_wave(
605 # kx=np.pi * np.array([0, 0.1, 0.1]),
606 # ky=np.pi * np.array([0, 0, 0]),
607 # )
608 # )
609
610 # kxs = np.linspace(0, 1, 101) * np.pi
611 # kappaNum = np.zeros_like(kxs, dtype=np.complex128)
612 # for ikx, kx in enumerate(kxs):
613 # kappaNum[ikx] = 1j * tester.test_one_wave(kx, 0.0)
614
615 print(
616 tester.test_conv_rate(
617 10,
618 dT=0.1,
619 kx=np.pi * np.array([0, 0.1, 0.1]),
620 ky=np.pi * np.array([0, 0, 0]),
621 multigrid_niters=(0, 0),
622 )
623 )
624
625
626if __name__ == "__main__":
627 test()
update_eval_settings(self, ax=1.0, ay=0, sigma=0.0)
uSync(self, np.ndarray kx, np.ndarray ky)
uRecSync(self, np.ndarray kx, np.ndarray ky)
DoReconstruction(self, kx, ky, n_iter=10000, tol=1e-15, n_print=0, n_iter_min=1)
test_conv_rate(self, dTau=10, dT=1e100, np.ndarray kx=np.array([0]), np.ndarray ky=np.array([0]), n_iter=10000, tol=1e-15, n_print=0, n_iter_min=1, singlegrid_niter=1, multigrid_niters=(0, 0), use_diff_Jacobi=False, top_override=-1, multigrid_res_fact=(1.0, 1.0), multigrid_dtau_fact=(1.0, 1.0))
test_one_wave(self, np.ndarray kx, np.ndarray ky, n_iter=10000, tol=1e-15, n_print=0, n_iter_min=1, u_free=1+0j, rhsOptions=CFV.ModelEvaluator.EvaluateRHSOptions())
update_vfv_settings(self, vfvSettings)
set_uFree(self, np.ndarray r, np.ndarray i)
__init__(self, mpi, vfvSettings=default_VRSettings(), ax=1.0, ay=0.0, sigma=0.0, AR=1.0, ob=0.0, batch_size=1)
Lightweight bundle of an MPI communicator and the calling rank's coordinates.
Definition MPI.hpp:215