@@ -521,23 +521,24 @@ def __init__(self):
521
521
param_names = (
522
522
"n_fragment" ,
523
523
"frag_size" ,
524
- "v_max" ,
525
524
"x_plus_y" ,
526
525
"vmin" ,
527
526
"nfmax" ,
528
527
"nfmax_is_not_none" ,
529
528
),
530
529
name_iter = "i" ,
531
530
body = """
532
- frag_size[i] = min(frag_size[i], v_max[i]);
533
- frag_size[i] = max(frag_size[i], vmin);
531
+ frag_size[i] = min(frag_size[i], x_plus_y[i])
534
532
535
533
if (nfmax_is_not_none) {
536
534
if (x_plus_y[i] / frag_size[i] > nfmax) {
537
535
frag_size[i] = x_plus_y[i] / nfmax;
538
536
}
539
537
}
540
- if (frag_size[i] == 0.0) {
538
+ else if (frag_size[i] < vmin) {
539
+ frag_size[i] = x_plus_y[i];
540
+ }
541
+ else if (frag_size[i] == 0.0) {
541
542
frag_size[i] = x_plus_y[i];
542
543
}
543
544
n_fragment[i] = x_plus_y[i] / frag_size[i];
@@ -549,10 +550,8 @@ def __init__(self):
549
550
param_names = ("mu" , "sigma" , "frag_size" , "rand" ),
550
551
name_iter = "i" ,
551
552
body = f"""
552
- frag_size[i] = { self .formulae .fragmentation_function .frag_size .c_inline (
553
- mu = "mu" ,
554
- sigma = "sigma" ,
555
- rand = "rand[i]"
553
+ frag_size[i] = mu + sigma * { self .formulae .trivia .erfinv_approx .c_inline (
554
+ c = "rand[i]"
556
555
)} ;
557
556
""" .replace (
558
557
"real_type" , self ._get_c_type ()
@@ -610,6 +609,20 @@ def __init__(self):
610
609
Nrt[i] = Nr1[i] + Nr2[i] + Nr3[i] + Nr4[i];
611
610
"""
612
611
612
+ self .__straub_mass_remainder = """
613
+ Nr1[i] = Nr1[i] * exp(3 * mu1 + 9 * pow(sigma1, 2.0) / 2);
614
+ Nr2[i] = Nr2[i] * (pow(mu2, 3.0) + 3 * mu2 * pow(sigma2, 2.0));
615
+ Nr3[i] = Nr3[i] * (pow(mu3, 3.0) + 3 * mu3 * pow(sigma3, 2.0));
616
+ Nr4[i] = v_max[i] * 6.0 / 3.141592654 + pow(ds[i], 3.0) - Nr1[i] - Nr2[i] - Nr3[i];
617
+ if Nr4[i] <= 0.0 {
618
+ d34[i] = 0;
619
+ Nr4[i] = 0;
620
+ }
621
+ else {
622
+ d34[i] = exp(log(Nr4[i]) / 3);
623
+ }
624
+ """
625
+
613
626
if self .formulae .fragmentation_function .__name__ == "Straub2010Nf" :
614
627
self .__straub_fragmentation_body = trtc .For (
615
628
param_names = (
@@ -624,41 +637,44 @@ def __init__(self):
624
637
"Nr3" ,
625
638
"Nr4" ,
626
639
"Nrt" ,
640
+ "d34" ,
627
641
),
628
642
name_iter = "i" ,
629
643
body = f"""
630
644
{ self .__straub_Nr_body }
645
+ auto sigma1 = { self .formulae .fragmentation_function .params_sigma1 .c_inline (CW = "CW[i]" )} ;
646
+ auto mu1 = { self .formulae .fragmentation_function .params_mu1 .c_inline (sigma1 = "sigma1" )} ;
647
+ auto sigma2 = { self .formulae .fragmentation_function .params_sigma2 .c_inline (CW = "CW[i]" )} ;
648
+ auto mu2 = { self .formulae .fragmentation_function .params_mu2 .c_inline (ds = "ds[i]" )} ;
649
+ auto sigma3 = { self .formulae .fragmentation_function .params_sigma3 .c_inline (CW = "CW[i]" )} ;
650
+ auto mu3 = { self .formulae .fragmentation_function .params_mu3 .c_inline (ds = "ds[i]" )} ;
651
+ { self .__straub_mass_remainder }
652
+ Nrt[i] = Nr1[i] + Nr2[i] + Nr3[i] + Nr4[i]
631
653
632
654
if (rand[i] < Nr1[i] / Nrt[i]) {{
633
- auto sigma1 = { self .formulae .fragmentation_function .sigma1 .c_inline (CW = "CW[i]" )} ;
634
- frag_size[i] = { self .formulae .fragmentation_function .p1 .c_inline (
635
- sigma1 = "sigma1" ,
636
- rand = "rand[i] * Nrt[i] / Nr1[i]"
655
+ auto X = rand[i] * Nrt[i] / Nr1[i];
656
+ auto lnarg = mu1 + sqrt(2.0) * sigma1 * { self .formulae .trivia .erfinv_approx .c_inline (
657
+ c = "X"
637
658
)} ;
659
+ frag_size[i] = exp(lnarg);
638
660
}}
639
661
else if (rand[i] < (Nr2[i] + Nr1[i]) / Nrt[i]) {{
640
- frag_size [i] = { self . formulae . fragmentation_function . p2 . c_inline (
641
- CW = "CW[i]" ,
642
- rand = "(rand[i] * Nrt[i] - Nr1[i]) / (Nr2[i] - Nr1[i]) "
662
+ auto X = (rand [i] * Nrt[i] - Nr1[i]) / Nr2[i];
663
+ frag_size[i] = mu2 + sqrt(2.0) * sigma2 * { self . formulae . trivia . erfinv_approx . c_inline (
664
+ c = "X "
643
665
)} ;
644
666
}}
645
667
else if (rand[i] < (Nr3[i] + Nr2[i] + Nr1[i]) / Nrt[i]) {{
646
- frag_size[i] = { self .formulae .fragmentation_function .p3 .c_inline (
647
- CW = "CW[i]" ,
648
- ds = "ds[i]" ,
649
- rand = "(rand[i] * Nrt[i] - Nr2[i]) / (Nr3[i] - Nr2[i])"
668
+ auto X = (rand[i] * Nrt[i] - Nr1[i] - Nr2[i]) / Nr3[i];
669
+ frag_size[i] = mu3 + sqrt(2.0) * sigma3 * { self .formulae .trivia .erfinv_approx .c_inline (
670
+ c = "X"
650
671
)} ;
651
672
}}
652
673
else {{
653
- frag_size[i] = { self .formulae .fragmentation_function .p4 .c_inline (
654
- CW = "CW[i]" ,
655
- ds = "ds[i]" ,
656
- v_max = "v_max[i]" ,
657
- Nr1 = "Nr1[i]" ,
658
- Nr2 = "Nr2[i]" ,
659
- Nr3 = "Nr3[i]"
660
- )} ;
674
+ frag_size[i] = d34[i];
661
675
}}
676
+
677
+ frag_size[i] = pow(frag_size[i], 3.0) * 3.141592654 / 6.0
662
678
""" .replace (
663
679
"real_type" , self ._get_c_type ()
664
680
),
@@ -910,7 +926,6 @@ def exp_fragmentation(
910
926
n_fragment ,
911
927
scale ,
912
928
frag_size ,
913
- v_max ,
914
929
x_plus_y ,
915
930
rand ,
916
931
vmin ,
@@ -932,7 +947,6 @@ def exp_fragmentation(
932
947
args = (
933
948
n_fragment .data ,
934
949
frag_size .data ,
935
- v_max .data ,
936
950
x_plus_y .data ,
937
951
self ._get_floating_point (vmin ),
938
952
self ._get_floating_point (nfmax if nfmax else - 1 ),
@@ -941,7 +955,7 @@ def exp_fragmentation(
941
955
)
942
956
943
957
def gauss_fragmentation (
944
- self , * , n_fragment , mu , sigma , frag_size , v_max , x_plus_y , rand , vmin , nfmax
958
+ self , * , n_fragment , mu , sigma , frag_size , x_plus_y , rand , vmin , nfmax
945
959
):
946
960
self .__gauss_fragmentation_body .launch_n (
947
961
n = len (frag_size ),
@@ -958,7 +972,6 @@ def gauss_fragmentation(
958
972
args = (
959
973
n_fragment .data ,
960
974
frag_size .data ,
961
- v_max .data ,
962
975
x_plus_y .data ,
963
976
self ._get_floating_point (vmin ),
964
977
self ._get_floating_point (nfmax if nfmax else - 1 ),
@@ -967,7 +980,7 @@ def gauss_fragmentation(
967
980
)
968
981
969
982
def slams_fragmentation (
970
- self , n_fragment , frag_size , v_max , x_plus_y , probs , rand , vmin , nfmax
983
+ self , n_fragment , frag_size , x_plus_y , probs , rand , vmin , nfmax
971
984
): # pylint: disable=too-many-arguments
972
985
self .__slams_fragmentation_body .launch_n (
973
986
n = (len (n_fragment )),
@@ -985,7 +998,6 @@ def slams_fragmentation(
985
998
args = (
986
999
n_fragment .data ,
987
1000
frag_size .data ,
988
- v_max .data ,
989
1001
x_plus_y .data ,
990
1002
self ._get_floating_point (vmin ),
991
1003
self ._get_floating_point (nfmax if nfmax else - 1 ),
@@ -999,7 +1011,6 @@ def feingold1988_fragmentation(
999
1011
n_fragment ,
1000
1012
scale ,
1001
1013
frag_size ,
1002
- v_max ,
1003
1014
x_plus_y ,
1004
1015
rand ,
1005
1016
fragtol ,
@@ -1022,7 +1033,6 @@ def feingold1988_fragmentation(
1022
1033
args = (
1023
1034
n_fragment .data ,
1024
1035
frag_size .data ,
1025
- v_max .data ,
1026
1036
x_plus_y .data ,
1027
1037
self ._get_floating_point (vmin ),
1028
1038
self ._get_floating_point (nfmax if nfmax else - 1 ),
@@ -1049,6 +1059,7 @@ def straub_fragmentation(
1049
1059
Nr3 ,
1050
1060
Nr4 ,
1051
1061
Nrt ,
1062
+ d34 ,
1052
1063
):
1053
1064
self .__straub_fragmentation_body .launch_n (
1054
1065
n = len (frag_size ),
@@ -1064,6 +1075,7 @@ def straub_fragmentation(
1064
1075
Nr3 .data ,
1065
1076
Nr4 .data ,
1066
1077
Nrt .data ,
1078
+ d34 .data ,
1067
1079
),
1068
1080
)
1069
1081
@@ -1072,7 +1084,6 @@ def straub_fragmentation(
1072
1084
args = (
1073
1085
n_fragment .data ,
1074
1086
frag_size .data ,
1075
- v_max .data ,
1076
1087
x_plus_y .data ,
1077
1088
self ._get_floating_point (vmin ),
1078
1089
self ._get_floating_point (nfmax if nfmax else - 1 ),
0 commit comments