4
4
"""
5
5
6
6
from itertools import repeat
7
+ from pathlib import Path
7
8
from pprint import pformat
8
9
9
10
import numpy as np
14
15
from modflow_devtools .markers import requires_exe , requires_pkg
15
16
16
17
import flopy
18
+ from flopy .discretization .modeltime import ModelTime
17
19
from flopy .modflow import Modflow
18
20
from flopy .utils import (
19
21
BinaryHeader ,
25
27
)
26
28
from flopy .utils .binaryfile import (
27
29
get_headfile_precision ,
28
- write_budget ,
29
- write_head ,
30
30
)
31
31
from flopy .utils .gridutil import get_disv_kwargs , uniform_flow_field
32
32
@@ -375,43 +375,6 @@ def test_get_headfile_precision(example_data_path):
375
375
assert precision == "double"
376
376
377
377
378
- def test_write_head (function_tmpdir ):
379
- file_path = function_tmpdir / "headfile"
380
- head_data = np .random .random ((10 , 10 ))
381
-
382
- write_head (file_path , head_data )
383
-
384
- assert file_path .is_file ()
385
- content = np .fromfile (file_path )
386
- assert np .array_equal (head_data .ravel (), content )
387
-
388
- # TODO: what else needs to be checked here?
389
-
390
-
391
- def test_write_budget (function_tmpdir ):
392
- file_path = function_tmpdir / "budgetfile"
393
-
394
- nlay = 3
395
- nrow = 3
396
- ncol = 3
397
- qx = 1.0
398
- qy = 0.0
399
- qz = 0.0
400
- shape = (nlay , nrow , ncol )
401
- spdis , flowja = uniform_flow_field (qx , qy , qz , shape )
402
-
403
- write_budget (file_path , flowja , kstp = 0 )
404
- assert file_path .is_file ()
405
- content1 = np .fromfile (file_path )
406
-
407
- write_budget (file_path , flowja , kstp = 1 , kper = 1 , text = "text" )
408
- assert file_path .is_file ()
409
- content2 = np .fromfile (file_path )
410
-
411
- # TODO: why are these the same?
412
- assert np .array_equal (content1 , content2 )
413
-
414
-
415
378
def test_binaryfile_read (function_tmpdir , freyberg_model_path ):
416
379
h = HeadFile (freyberg_model_path / "freyberg.githds" )
417
380
assert isinstance (h , HeadFile )
@@ -466,7 +429,7 @@ def test_binaryfile_read_context(freyberg_model_path):
466
429
assert str (e .value ) == "seek of closed file" , str (e .value )
467
430
468
431
469
- def test_binaryfile_reverse_mf6_dis (function_tmpdir ):
432
+ def test_binaryfile_reverse_mf6_dis_symmetric (function_tmpdir ):
470
433
name = "reverse_dis"
471
434
sim = flopy .mf6 .MFSimulation (sim_name = name , sim_ws = function_tmpdir , exe_name = "mf6" )
472
435
tdis_rc = [(1 , 1 , 1.0 ), (1 , 1 , 1.0 ), (1 , 1 , 1.0 )]
@@ -501,36 +464,43 @@ def test_binaryfile_reverse_mf6_dis(function_tmpdir):
501
464
success , buff = sim .run_simulation (silent = True , report = True )
502
465
assert success , pformat (buff )
503
466
504
- # reverse head file in place and check reversal
505
467
head_file = flopy .utils .HeadFile (function_tmpdir / head_file )
506
468
orig_heads = head_file .get_alldata ()
469
+ orig_times = head_file .get_times ()
507
470
orig_kstpkper = head_file .get_kstpkper ()
508
471
head_file .reverse ()
509
472
rev_heads = head_file .get_alldata ()
473
+ rev_times = head_file .get_times ()
510
474
rev_kstpkper = head_file .get_kstpkper ()
511
475
exp_head_shape = (nper , 2 , 10 , 10 )
476
+ assert orig_times == rev_times
512
477
assert orig_heads .shape == exp_head_shape
513
478
assert rev_heads .shape == (nper , 2 , 10 , 10 )
514
479
assert orig_kstpkper == rev_kstpkper
515
480
516
- # reverse budget and write to separate file
517
481
budget_file_rev_path = function_tmpdir / f"{ budget_file } _rev"
518
482
budget_file = flopy .utils .CellBudgetFile (function_tmpdir / budget_file )
519
483
budget_file .reverse (budget_file_rev_path )
520
484
budget_file_rev = flopy .utils .CellBudgetFile (budget_file_rev_path )
521
485
assert budget_file .get_kstpkper () == orig_kstpkper
522
486
assert budget_file_rev .get_kstpkper () == rev_kstpkper
523
487
524
- for kper in range (nper ):
488
+ budtxt = "FLOW-JA-FACE"
489
+ tmax = orig_times [- 1 ]
490
+ perlen = tdis .perioddata .get_data ().perlen
491
+
492
+ for (_ , kper ), t in zip (orig_kstpkper , orig_times ):
525
493
assert np .allclose (orig_heads [kper ], rev_heads [- (kper + 1 )])
526
- budget = budget_file .get_data (text = "FLOW-JA-FACE" , totim = kper )[0 ]
527
- budget_rev = budget_file_rev .get_data (text = "FLOW-JA-FACE" , totim = kper )[0 ]
494
+ budget = budget_file .get_data (text = budtxt , totim = t )[0 ]
495
+ budget_rev = budget_file_rev .get_data (
496
+ text = budtxt , totim = tmax - t + perlen [kper ]
497
+ )[0 ]
528
498
assert budget .shape == budget_rev .shape
529
499
assert np .allclose (budget , - budget_rev )
530
500
531
501
532
502
@requires_pkg ("shapely" )
533
- def test_binaryfile_reverse_mf6_disv (function_tmpdir ):
503
+ def test_binaryfile_reverse_mf6_disv_symmetric (function_tmpdir ):
534
504
name = "reverse_disv"
535
505
sim = flopy .mf6 .MFSimulation (sim_name = name , sim_ws = function_tmpdir , exe_name = "mf6" )
536
506
tdis_rc = [(1 , 1 , 1.0 ), (1 , 1 , 1.0 ), (1 , 1 , 1.0 )]
@@ -559,36 +529,42 @@ def test_binaryfile_reverse_mf6_disv(function_tmpdir):
559
529
success , buff = sim .run_simulation (silent = True )
560
530
assert success , pformat (buff )
561
531
562
- # reverse head file in place and check reversal
563
532
head_file = flopy .utils .HeadFile (function_tmpdir / head_file )
564
533
orig_heads = head_file .get_alldata ()
534
+ orig_times = head_file .get_times ()
565
535
orig_kstpkper = head_file .get_kstpkper ()
566
536
head_file .reverse ()
567
537
rev_heads = head_file .get_alldata ()
538
+ rev_times = head_file .get_times ()
568
539
rev_kstpkper = head_file .get_kstpkper ()
569
540
exp_shape = (nper , 2 , 1 , 100 )
541
+ assert orig_times == rev_times
570
542
assert orig_heads .shape == exp_shape
571
543
assert rev_heads .shape == exp_shape
572
544
assert orig_kstpkper == rev_kstpkper
573
545
574
- # reverse budget and write to separate file
575
546
budget_file_rev_path = function_tmpdir / f"{ budget_file } _rev"
576
547
budget_file = flopy .utils .CellBudgetFile (function_tmpdir / budget_file )
577
548
budget_file .reverse (budget_file_rev_path )
578
549
budget_file_rev = flopy .utils .CellBudgetFile (budget_file_rev_path , tdis = tdis )
579
550
assert budget_file .get_kstpkper () == orig_kstpkper
580
551
assert budget_file_rev .get_kstpkper () == rev_kstpkper
581
552
582
- for kper in range (nper ):
553
+ budtxt = "FLOW-JA-FACE"
554
+ tmax = orig_times [- 1 ]
555
+ perlen = tdis .perioddata .get_data ().perlen
556
+
557
+ for (_ , kper ), t in zip (orig_kstpkper , budget_file .get_times ()):
583
558
assert np .allclose (orig_heads [kper ], rev_heads [- (kper + 1 )])
584
- budget = budget_file .get_data (text = "FLOW-JA-FACE" , totim = kper )[0 ]
585
- budget_rev = budget_file_rev .get_data (text = "FLOW-JA-FACE" , totim = kper )[0 ]
559
+ budget = budget_file .get_data (text = budtxt , totim = t )[0 ]
560
+ budget_rev = budget_file_rev .get_data (
561
+ text = budtxt , totim = tmax - t + perlen [kper ]
562
+ )[0 ]
586
563
assert budget .shape == budget_rev .shape
587
564
assert np .allclose (budget , - budget_rev )
588
565
589
566
590
- def test_binaryfile_reverse_mf6_disu (example_data_path , function_tmpdir ):
591
- # load simulation and extract tdis
567
+ def test_binaryfile_reverse_mf6_disu_symmetric (example_data_path , function_tmpdir ):
592
568
sim_name = "test006_gwf3"
593
569
sim = flopy .mf6 .MFSimulation .load (
594
570
sim_name = sim_name , sim_ws = example_data_path / "mf6" / sim_name
@@ -600,48 +576,37 @@ def test_binaryfile_reverse_mf6_disu(example_data_path, function_tmpdir):
600
576
sim .write_simulation ()
601
577
sim .run_simulation ()
602
578
603
- # load head file, providing tdis as kwarg
604
579
file_path = function_tmpdir / "flow.hds"
605
580
head_file = HeadFile (file_path , tdis = tdis )
581
+ orig_heads = head_file .get_alldata ()
582
+ orig_times = head_file .get_times ()
606
583
orig_kstpkper = head_file .get_kstpkper ()
607
584
608
- # reverse and write to a separate file
609
585
head_file_rev_path = function_tmpdir / "flow_rev.hds"
610
586
head_file .reverse (filename = head_file_rev_path )
611
587
head_file_rev = HeadFile (head_file_rev_path )
588
+ rev_heads = head_file_rev .get_alldata ()
589
+ rev_times = head_file_rev .get_times ()
612
590
rev_kstpkper = head_file_rev .get_kstpkper ()
591
+ assert orig_times == rev_times
613
592
assert orig_kstpkper == rev_kstpkper
614
593
615
- # load budget file
616
594
file_path = function_tmpdir / "flow.cbc"
617
595
budget_file = CellBudgetFile (file_path , tdis = tdis )
618
-
619
- # reverse and write to a separate file
620
596
budget_file_rev_path = function_tmpdir / "flow_rev.cbc"
621
597
budget_file .reverse (filename = budget_file_rev_path )
622
598
budget_file_rev = CellBudgetFile (budget_file_rev_path )
623
599
assert budget_file .get_kstpkper () == orig_kstpkper
624
600
assert budget_file_rev .get_kstpkper () == rev_kstpkper
625
-
626
- # check that data from both files have the same shape
627
601
assert head_file .get_alldata ().shape == (nper , 1 , 1 , 121 )
628
602
assert head_file_rev .get_alldata ().shape == (nper , 1 , 1 , 121 )
629
-
630
- # check number of records
631
603
assert len (head_file ) == nper
632
604
assert len (head_file_rev ) == nper
633
605
assert len (budget_file ) == nper * 2
634
606
assert len (budget_file_rev ) == nper * 2
635
607
636
- # check that the data are reversed
637
608
nrecords = len (head_file )
638
609
for idx in range (nrecords - 1 , - 1 , - 1 ):
639
- # check headfile headers
640
- f_header = list (head_file .recordarray [nrecords - idx - 1 ])
641
- rf_header = list (head_file_rev .recordarray [idx ])
642
- assert f_header != rf_header
643
-
644
- # check headfile data
645
610
f_data = head_file .get_data (idx = idx )[0 ]
646
611
rf_data = head_file_rev .get_data (idx = nrecords - idx - 1 )[0 ]
647
612
assert f_data .shape == rf_data .shape
@@ -653,8 +618,16 @@ def test_binaryfile_reverse_mf6_disu(example_data_path, function_tmpdir):
653
618
else :
654
619
assert np .array_equal (f_data [0 ][0 ], rf_data [0 ][0 ])
655
620
656
- budget = budget_file .get_data (text = "FLOW-JA-FACE" , totim = idx )[0 ]
657
- budget_rev = budget_file_rev .get_data (text = "FLOW-JA-FACE" , totim = idx )[0 ]
621
+ budtxt = "FLOW-JA-FACE"
622
+ tmax = orig_times [- 1 ]
623
+ perlen = tdis .perioddata .get_data ().perlen
624
+
625
+ for (_ , kper ), t in zip (orig_kstpkper , budget_file .get_times ()):
626
+ assert np .allclose (orig_heads [kper ], rev_heads [- (kper + 1 )])
627
+ budget = budget_file .get_data (text = budtxt , totim = t )[0 ]
628
+ budget_rev = budget_file_rev .get_data (
629
+ text = budtxt , totim = tmax - t + perlen [kper ]
630
+ )[0 ]
658
631
assert budget .shape == budget_rev .shape
659
632
assert np .allclose (budget , - budget_rev )
660
633
0 commit comments