Compare commits
51 Commits
cjy-oneapi
...
cjy-dystop
| Author | SHA1 | Date | |
|---|---|---|---|
| f1fe9fd443 | |||
| 7bb9042b18 | |||
| 9991b7f41e | |||
| 57abf12bbd | |||
| 51efc47c1b | |||
| 234c4f7344 | |||
| 5070134857 | |||
| 4012e9d068 | |||
| b3c367f15b | |||
| e73911f292 | |||
| 7543d3e8c7 | |||
| 42c69fab24 | |||
| 95220a05c8 | |||
| 466b084a58 | |||
| 61ccef9f97 | |||
| e11363e06e | |||
| f70e90f694 | |||
|
|
75dd5353b0 | ||
|
|
23a82d063b | ||
| 44efb2e08c | |||
| 16013081e0 | |||
| 03416a7b28 | |||
| cca3c16c2b | |||
| e5231849ee | |||
| a766e49ff0 | |||
| 1a518cd3f6 | |||
| 1dc622e516 | |||
| 3046a0ccde | |||
| d4ec69c98a | |||
| 2c0a3055d4 | |||
| 1eba73acbe | |||
| b91cfff301 | |||
| e29ca2dca9 | |||
| 6493101ca0 | |||
| 169986cde1 | |||
| 1fbc213888 | |||
| 6024708a48 | |||
| bc457d981e | |||
| 51dead090e | |||
| 34d6922a66 | |||
| 8010ad27ed | |||
| 38e691f013 | |||
| 808387aa11 | |||
| c2b676abf2 | |||
| 2c60533501 | |||
| 318b5254cc | |||
| 3cee05f262 | |||
| e6329b013d | |||
| 2791d2e225 | |||
| 72ce153e48 | |||
|
|
79af79d471 |
@@ -1,9 +1,13 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
"""
|
"""
|
||||||
AMSS-NCKU GW150914 Simulation Regression Test Script
|
AMSS-NCKU GW150914 Simulation Regression Test Script (Comprehensive Version)
|
||||||
|
|
||||||
Verification Requirements:
|
Verification Requirements:
|
||||||
1. XY-plane trajectory RMS error < 1% (Optimized vs. baseline, max of BH1 and BH2)
|
1. RMS errors < 1% for:
|
||||||
|
- 3D Vector Total RMS
|
||||||
|
- X Component RMS
|
||||||
|
- Y Component RMS
|
||||||
|
- Z Component RMS
|
||||||
2. ADM constraint violation < 2 (Grid Level 0)
|
2. ADM constraint violation < 2 (Grid Level 0)
|
||||||
|
|
||||||
RMS Calculation Method:
|
RMS Calculation Method:
|
||||||
@@ -57,79 +61,62 @@ def load_constraint_data(filepath):
|
|||||||
data.append([float(x) for x in parts[:8]])
|
data.append([float(x) for x in parts[:8]])
|
||||||
return np.array(data)
|
return np.array(data)
|
||||||
|
|
||||||
|
def calculate_all_rms_errors(bh_data_ref, bh_data_target):
|
||||||
def calculate_rms_error(bh_data_ref, bh_data_target):
|
|
||||||
"""
|
"""
|
||||||
Calculate trajectory-based RMS error on the XY plane between baseline and optimized simulations.
|
Calculate 3D Vector RMS and component-wise RMS (X, Y, Z) independently.
|
||||||
|
Uses r = sqrt(x^2 + y^2) as the denominator for all error normalizations.
|
||||||
This function computes the RMS error independently for BH1 and BH2 trajectories,
|
Returns the maximum error between BH1 and BH2 for each category.
|
||||||
then returns the maximum of the two as the final RMS error metric.
|
|
||||||
|
|
||||||
For each black hole, the RMS is calculated as:
|
|
||||||
RMS = sqrt( (1/M) * sum( (Δr_i / r_i^max)^2 ) ) × 100%
|
|
||||||
|
|
||||||
where:
|
|
||||||
Δr_i = sqrt((x_ref,i - x_new,i)^2 + (y_ref,i - y_new,i)^2)
|
|
||||||
r_i^max = max(sqrt(x_ref,i^2 + y_ref,i^2), sqrt(x_new,i^2 + y_new,i^2))
|
|
||||||
|
|
||||||
Args:
|
|
||||||
bh_data_ref: Reference (baseline) trajectory data
|
|
||||||
bh_data_target: Target (optimized) trajectory data
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
rms_value: Final RMS error as a percentage (max of BH1 and BH2)
|
|
||||||
error: Error message if any
|
|
||||||
"""
|
"""
|
||||||
# Align data: truncate to the length of the shorter dataset
|
|
||||||
M = min(len(bh_data_ref['time']), len(bh_data_target['time']))
|
M = min(len(bh_data_ref['time']), len(bh_data_target['time']))
|
||||||
|
|
||||||
if M < 10:
|
if M < 10:
|
||||||
return None, "Insufficient data points for comparison"
|
return None, "Insufficient data points for comparison"
|
||||||
|
|
||||||
# Extract XY coordinates for both black holes
|
results = {}
|
||||||
x1_ref = bh_data_ref['x1'][:M]
|
|
||||||
y1_ref = bh_data_ref['y1'][:M]
|
|
||||||
x2_ref = bh_data_ref['x2'][:M]
|
|
||||||
y2_ref = bh_data_ref['y2'][:M]
|
|
||||||
|
|
||||||
x1_new = bh_data_target['x1'][:M]
|
for bh in ['1', '2']:
|
||||||
y1_new = bh_data_target['y1'][:M]
|
x_r, y_r, z_r = bh_data_ref[f'x{bh}'][:M], bh_data_ref[f'y{bh}'][:M], bh_data_ref[f'z{bh}'][:M]
|
||||||
x2_new = bh_data_target['x2'][:M]
|
x_n, y_n, z_n = bh_data_target[f'x{bh}'][:M], bh_data_target[f'y{bh}'][:M], bh_data_target[f'z{bh}'][:M]
|
||||||
y2_new = bh_data_target['y2'][:M]
|
|
||||||
|
|
||||||
# Calculate RMS for BH1
|
# 核心修改:根据组委会的邮件指示,分母统一使用 r = sqrt(x^2 + y^2)
|
||||||
delta_r1 = np.sqrt((x1_ref - x1_new)**2 + (y1_ref - y1_new)**2)
|
r_ref = np.sqrt(x_r**2 + y_r**2)
|
||||||
r1_ref = np.sqrt(x1_ref**2 + y1_ref**2)
|
r_new = np.sqrt(x_n**2 + y_n**2)
|
||||||
r1_new = np.sqrt(x1_new**2 + y1_new**2)
|
denom_max = np.maximum(r_ref, r_new)
|
||||||
r1_max = np.maximum(r1_ref, r1_new)
|
|
||||||
|
|
||||||
# Calculate RMS for BH2
|
valid = denom_max > 1e-15
|
||||||
delta_r2 = np.sqrt((x2_ref - x2_new)**2 + (y2_ref - y2_new)**2)
|
if np.sum(valid) < 10:
|
||||||
r2_ref = np.sqrt(x2_ref**2 + y2_ref**2)
|
results[f'BH{bh}'] = { '3D_Vector': 0.0, 'X_Component': 0.0, 'Y_Component': 0.0, 'Z_Component': 0.0 }
|
||||||
r2_new = np.sqrt(x2_new**2 + y2_new**2)
|
continue
|
||||||
r2_max = np.maximum(r2_ref, r2_new)
|
|
||||||
|
|
||||||
# Avoid division by zero for BH1
|
def calc_rms(delta):
|
||||||
valid_mask1 = r1_max > 1e-15
|
# 将对应分量的偏差除以统一的轨道半径分母 denom_max
|
||||||
if np.sum(valid_mask1) < 10:
|
return np.sqrt(np.mean((delta[valid] / denom_max[valid])**2)) * 100
|
||||||
return None, "Insufficient valid data points for BH1"
|
|
||||||
|
|
||||||
terms1 = (delta_r1[valid_mask1] / r1_max[valid_mask1])**2
|
# 1. Total 3D Vector RMS
|
||||||
rms_bh1 = np.sqrt(np.mean(terms1)) * 100
|
delta_vec = np.sqrt((x_r - x_n)**2 + (y_r - y_n)**2 + (z_r - z_n)**2)
|
||||||
|
rms_3d = calc_rms(delta_vec)
|
||||||
|
|
||||||
# Avoid division by zero for BH2
|
# 2. Component-wise RMS (分离计算各轴,但共用半径分母)
|
||||||
valid_mask2 = r2_max > 1e-15
|
rms_x = calc_rms(np.abs(x_r - x_n))
|
||||||
if np.sum(valid_mask2) < 10:
|
rms_y = calc_rms(np.abs(y_r - y_n))
|
||||||
return None, "Insufficient valid data points for BH2"
|
rms_z = calc_rms(np.abs(z_r - z_n))
|
||||||
|
|
||||||
terms2 = (delta_r2[valid_mask2] / r2_max[valid_mask2])**2
|
results[f'BH{bh}'] = {
|
||||||
rms_bh2 = np.sqrt(np.mean(terms2)) * 100
|
'3D_Vector': rms_3d,
|
||||||
|
'X_Component': rms_x,
|
||||||
|
'Y_Component': rms_y,
|
||||||
|
'Z_Component': rms_z
|
||||||
|
}
|
||||||
|
|
||||||
# Final RMS is the maximum of BH1 and BH2
|
# 获取 BH1 和 BH2 中的最大误差
|
||||||
rms_final = max(rms_bh1, rms_bh2)
|
max_rms = {
|
||||||
|
'3D_Vector': max(results['BH1']['3D_Vector'], results['BH2']['3D_Vector']),
|
||||||
return rms_final, None
|
'X_Component': max(results['BH1']['X_Component'], results['BH2']['X_Component']),
|
||||||
|
'Y_Component': max(results['BH1']['Y_Component'], results['BH2']['Y_Component']),
|
||||||
|
'Z_Component': max(results['BH1']['Z_Component'], results['BH2']['Z_Component'])
|
||||||
|
}
|
||||||
|
|
||||||
|
return max_rms, None
|
||||||
|
|
||||||
def analyze_constraint_violation(constraint_data, n_levels=9):
|
def analyze_constraint_violation(constraint_data, n_levels=9):
|
||||||
"""
|
"""
|
||||||
@@ -155,34 +142,32 @@ def analyze_constraint_violation(constraint_data, n_levels=9):
|
|||||||
|
|
||||||
|
|
||||||
def print_header():
|
def print_header():
|
||||||
"""Print report header"""
|
|
||||||
print("\n" + Color.BLUE + Color.BOLD + "=" * 65 + Color.RESET)
|
print("\n" + Color.BLUE + Color.BOLD + "=" * 65 + Color.RESET)
|
||||||
print(Color.BOLD + " AMSS-NCKU GW150914 Simulation Regression Test Report" + Color.RESET)
|
print(Color.BOLD + " AMSS-NCKU GW150914 Comprehensive Regression Test" + Color.RESET)
|
||||||
print(Color.BLUE + Color.BOLD + "=" * 65 + Color.RESET)
|
print(Color.BLUE + Color.BOLD + "=" * 65 + Color.RESET)
|
||||||
|
|
||||||
|
def print_rms_results(rms_dict, error, threshold=1.0):
|
||||||
def print_rms_results(rms_rel, error, threshold=1.0):
|
print(f"\n{Color.BOLD}1. RMS Error Analysis (Maximums of BH1 & BH2){Color.RESET}")
|
||||||
"""Print RMS error results"""
|
print("-" * 65)
|
||||||
print(f"\n{Color.BOLD}1. RMS Error Analysis (Baseline vs Optimized){Color.RESET}")
|
|
||||||
print("-" * 45)
|
|
||||||
|
|
||||||
if error:
|
if error:
|
||||||
print(f" {Color.RED}Error: {error}{Color.RESET}")
|
print(f" {Color.RED}Error: {error}{Color.RESET}")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
passed = rms_rel < threshold
|
all_passed = True
|
||||||
|
print(f" Requirement: < {threshold}%\n")
|
||||||
|
|
||||||
print(f" RMS relative error: {rms_rel:.4f}%")
|
for key, val in rms_dict.items():
|
||||||
print(f" Requirement: < {threshold}%")
|
passed = val < threshold
|
||||||
print(f" Status: {get_status_text(passed)}")
|
all_passed = all_passed and passed
|
||||||
|
status = get_status_text(passed)
|
||||||
return passed
|
print(f" {key:15}: {val:8.4f}% | Status: {status}")
|
||||||
|
|
||||||
|
return all_passed
|
||||||
|
|
||||||
def print_constraint_results(results, threshold=2.0):
|
def print_constraint_results(results, threshold=2.0):
|
||||||
"""Print constraint violation results"""
|
|
||||||
print(f"\n{Color.BOLD}2. ADM Constraint Violation Analysis (Grid Level 0){Color.RESET}")
|
print(f"\n{Color.BOLD}2. ADM Constraint Violation Analysis (Grid Level 0){Color.RESET}")
|
||||||
print("-" * 45)
|
print("-" * 65)
|
||||||
|
|
||||||
names = ['Ham', 'Px', 'Py', 'Pz', 'Gx', 'Gy', 'Gz']
|
names = ['Ham', 'Px', 'Py', 'Pz', 'Gx', 'Gy', 'Gz']
|
||||||
for i, name in enumerate(names):
|
for i, name in enumerate(names):
|
||||||
@@ -200,7 +185,6 @@ def print_constraint_results(results, threshold=2.0):
|
|||||||
|
|
||||||
|
|
||||||
def print_summary(rms_passed, constraint_passed):
|
def print_summary(rms_passed, constraint_passed):
|
||||||
"""Print summary"""
|
|
||||||
print("\n" + Color.BLUE + Color.BOLD + "=" * 65 + Color.RESET)
|
print("\n" + Color.BLUE + Color.BOLD + "=" * 65 + Color.RESET)
|
||||||
print(Color.BOLD + "Verification Summary" + Color.RESET)
|
print(Color.BOLD + "Verification Summary" + Color.RESET)
|
||||||
print(Color.BLUE + Color.BOLD + "=" * 65 + Color.RESET)
|
print(Color.BLUE + Color.BOLD + "=" * 65 + Color.RESET)
|
||||||
@@ -210,7 +194,7 @@ def print_summary(rms_passed, constraint_passed):
|
|||||||
res_rms = get_status_text(rms_passed)
|
res_rms = get_status_text(rms_passed)
|
||||||
res_con = get_status_text(constraint_passed)
|
res_con = get_status_text(constraint_passed)
|
||||||
|
|
||||||
print(f" [1] RMS trajectory check: {res_rms}")
|
print(f" [1] Comprehensive RMS check: {res_rms}")
|
||||||
print(f" [2] ADM constraint check: {res_con}")
|
print(f" [2] ADM constraint check: {res_con}")
|
||||||
|
|
||||||
final_status = f"{Color.GREEN}{Color.BOLD}ALL CHECKS PASSED{Color.RESET}" if all_passed else f"{Color.RED}{Color.BOLD}SOME CHECKS FAILED{Color.RESET}"
|
final_status = f"{Color.GREEN}{Color.BOLD}ALL CHECKS PASSED{Color.RESET}" if all_passed else f"{Color.RED}{Color.BOLD}SOME CHECKS FAILED{Color.RESET}"
|
||||||
@@ -219,61 +203,48 @@ def print_summary(rms_passed, constraint_passed):
|
|||||||
|
|
||||||
return all_passed
|
return all_passed
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
# Determine target (optimized) output directory
|
|
||||||
if len(sys.argv) > 1:
|
if len(sys.argv) > 1:
|
||||||
target_dir = sys.argv[1]
|
target_dir = sys.argv[1]
|
||||||
else:
|
else:
|
||||||
script_dir = os.path.dirname(os.path.abspath(__file__))
|
script_dir = os.path.dirname(os.path.abspath(__file__))
|
||||||
target_dir = os.path.join(script_dir, "GW150914/AMSS_NCKU_output")
|
target_dir = os.path.join(script_dir, "GW150914/AMSS_NCKU_output")
|
||||||
|
|
||||||
# Determine reference (baseline) directory
|
|
||||||
script_dir = os.path.dirname(os.path.abspath(__file__))
|
script_dir = os.path.dirname(os.path.abspath(__file__))
|
||||||
reference_dir = os.path.join(script_dir, "GW150914-origin/AMSS_NCKU_output")
|
reference_dir = os.path.join(script_dir, "GW150914-origin/AMSS_NCKU_output")
|
||||||
|
|
||||||
# Data file paths
|
|
||||||
bh_file_ref = os.path.join(reference_dir, "bssn_BH.dat")
|
bh_file_ref = os.path.join(reference_dir, "bssn_BH.dat")
|
||||||
bh_file_target = os.path.join(target_dir, "bssn_BH.dat")
|
bh_file_target = os.path.join(target_dir, "bssn_BH.dat")
|
||||||
constraint_file = os.path.join(target_dir, "bssn_constraint.dat")
|
constraint_file = os.path.join(target_dir, "bssn_constraint.dat")
|
||||||
|
|
||||||
# Check if files exist
|
|
||||||
if not os.path.exists(bh_file_ref):
|
if not os.path.exists(bh_file_ref):
|
||||||
print(f"{Color.RED}{Color.BOLD}Error:{Color.RESET} Baseline trajectory file not found: {bh_file_ref}")
|
print(f"{Color.RED}{Color.BOLD}Error:{Color.RESET} Baseline trajectory file not found: {bh_file_ref}")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
if not os.path.exists(bh_file_target):
|
if not os.path.exists(bh_file_target):
|
||||||
print(f"{Color.RED}{Color.BOLD}Error:{Color.RESET} Target trajectory file not found: {bh_file_target}")
|
print(f"{Color.RED}{Color.BOLD}Error:{Color.RESET} Target trajectory file not found: {bh_file_target}")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
if not os.path.exists(constraint_file):
|
if not os.path.exists(constraint_file):
|
||||||
print(f"{Color.RED}{Color.BOLD}Error:{Color.RESET} Constraint data file not found: {constraint_file}")
|
print(f"{Color.RED}{Color.BOLD}Error:{Color.RESET} Constraint data file not found: {constraint_file}")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
# Print header
|
|
||||||
print_header()
|
print_header()
|
||||||
print(f"\n{Color.BOLD}Reference (Baseline):{Color.RESET} {Color.BLUE}{reference_dir}{Color.RESET}")
|
print(f"\n{Color.BOLD}Reference (Baseline):{Color.RESET} {Color.BLUE}{reference_dir}{Color.RESET}")
|
||||||
print(f"{Color.BOLD}Target (Optimized): {Color.RESET} {Color.BLUE}{target_dir}{Color.RESET}")
|
print(f"{Color.BOLD}Target (Optimized): {Color.RESET} {Color.BLUE}{target_dir}{Color.RESET}")
|
||||||
|
|
||||||
# Load data
|
|
||||||
bh_data_ref = load_bh_trajectory(bh_file_ref)
|
bh_data_ref = load_bh_trajectory(bh_file_ref)
|
||||||
bh_data_target = load_bh_trajectory(bh_file_target)
|
bh_data_target = load_bh_trajectory(bh_file_target)
|
||||||
constraint_data = load_constraint_data(constraint_file)
|
constraint_data = load_constraint_data(constraint_file)
|
||||||
|
|
||||||
# Calculate RMS error
|
# Output modified RMS results
|
||||||
rms_rel, error = calculate_rms_error(bh_data_ref, bh_data_target)
|
rms_dict, error = calculate_all_rms_errors(bh_data_ref, bh_data_target)
|
||||||
rms_passed = print_rms_results(rms_rel, error)
|
rms_passed = print_rms_results(rms_dict, error)
|
||||||
|
|
||||||
# Analyze constraint violation
|
# Output constraint results
|
||||||
constraint_results = analyze_constraint_violation(constraint_data)
|
constraint_results = analyze_constraint_violation(constraint_data)
|
||||||
constraint_passed = print_constraint_results(constraint_results)
|
constraint_passed = print_constraint_results(constraint_results)
|
||||||
|
|
||||||
# Print summary
|
|
||||||
all_passed = print_summary(rms_passed, constraint_passed)
|
all_passed = print_summary(rms_passed, constraint_passed)
|
||||||
|
|
||||||
# Return exit code
|
|
||||||
sys.exit(0 if all_passed else 1)
|
sys.exit(0 if all_passed else 1)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <new>
|
#include <new>
|
||||||
|
#include <vector>
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
@@ -17,6 +18,168 @@ using namespace std;
|
|||||||
#include "interp_lb_profile.h"
|
#include "interp_lb_profile.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
struct InterpBlockView
|
||||||
|
{
|
||||||
|
Block *bp;
|
||||||
|
double llb[dim];
|
||||||
|
double uub[dim];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct BlockBinIndex
|
||||||
|
{
|
||||||
|
int bins[dim];
|
||||||
|
double lo[dim];
|
||||||
|
double inv[dim];
|
||||||
|
vector<InterpBlockView> views;
|
||||||
|
vector<vector<int>> bin_to_blocks;
|
||||||
|
bool valid;
|
||||||
|
|
||||||
|
BlockBinIndex() : valid(false)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < dim; i++)
|
||||||
|
{
|
||||||
|
bins[i] = 1;
|
||||||
|
lo[i] = 0.0;
|
||||||
|
inv[i] = 0.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
inline int clamp_int(int v, int lo, int hi)
|
||||||
|
{
|
||||||
|
return (v < lo) ? lo : ((v > hi) ? hi : v);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline int coord_to_bin(double x, double lo, double inv, int nb)
|
||||||
|
{
|
||||||
|
if (nb <= 1 || inv <= 0.0)
|
||||||
|
return 0;
|
||||||
|
int b = int(floor((x - lo) * inv));
|
||||||
|
return clamp_int(b, 0, nb - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline int bin_loc(const BlockBinIndex &index, int b0, int b1, int b2)
|
||||||
|
{
|
||||||
|
return b0 + index.bins[0] * (b1 + index.bins[1] * b2);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool point_in_block_view(const InterpBlockView &view, const double *pox, const double *DH)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < dim; i++)
|
||||||
|
{
|
||||||
|
if (pox[i] - view.llb[i] < -DH[i] / 2 || pox[i] - view.uub[i] > DH[i] / 2)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void build_block_bin_index(Patch *patch, const double *DH, BlockBinIndex &index)
|
||||||
|
{
|
||||||
|
index = BlockBinIndex();
|
||||||
|
|
||||||
|
MyList<Block> *Bp = patch->blb;
|
||||||
|
while (Bp)
|
||||||
|
{
|
||||||
|
Block *BP = Bp->data;
|
||||||
|
InterpBlockView view;
|
||||||
|
view.bp = BP;
|
||||||
|
for (int i = 0; i < dim; i++)
|
||||||
|
{
|
||||||
|
#ifdef Vertex
|
||||||
|
#ifdef Cell
|
||||||
|
#error Both Cell and Vertex are defined
|
||||||
|
#endif
|
||||||
|
view.llb[i] = (feq(BP->bbox[i], patch->bbox[i], DH[i] / 2)) ? BP->bbox[i] + patch->lli[i] * DH[i] : BP->bbox[i] + (ghost_width - 0.5) * DH[i];
|
||||||
|
view.uub[i] = (feq(BP->bbox[dim + i], patch->bbox[dim + i], DH[i] / 2)) ? BP->bbox[dim + i] - patch->uui[i] * DH[i] : BP->bbox[dim + i] - (ghost_width - 0.5) * DH[i];
|
||||||
|
#else
|
||||||
|
#ifdef Cell
|
||||||
|
view.llb[i] = (feq(BP->bbox[i], patch->bbox[i], DH[i] / 2)) ? BP->bbox[i] + patch->lli[i] * DH[i] : BP->bbox[i] + ghost_width * DH[i];
|
||||||
|
view.uub[i] = (feq(BP->bbox[dim + i], patch->bbox[dim + i], DH[i] / 2)) ? BP->bbox[dim + i] - patch->uui[i] * DH[i] : BP->bbox[dim + i] - ghost_width * DH[i];
|
||||||
|
#else
|
||||||
|
#error Not define Vertex nor Cell
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
index.views.push_back(view);
|
||||||
|
if (Bp == patch->ble)
|
||||||
|
break;
|
||||||
|
Bp = Bp->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
const int nblocks = int(index.views.size());
|
||||||
|
if (nblocks <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
int bins_1d = int(ceil(pow(double(nblocks), 1.0 / 3.0)));
|
||||||
|
bins_1d = clamp_int(bins_1d, 1, 32);
|
||||||
|
for (int i = 0; i < dim; i++)
|
||||||
|
{
|
||||||
|
index.bins[i] = bins_1d;
|
||||||
|
index.lo[i] = patch->bbox[i] + patch->lli[i] * DH[i];
|
||||||
|
const double hi = patch->bbox[dim + i] - patch->uui[i] * DH[i];
|
||||||
|
if (hi > index.lo[i] && bins_1d > 1)
|
||||||
|
index.inv[i] = bins_1d / (hi - index.lo[i]);
|
||||||
|
else
|
||||||
|
index.inv[i] = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
index.bin_to_blocks.resize(index.bins[0] * index.bins[1] * index.bins[2]);
|
||||||
|
|
||||||
|
for (int bi = 0; bi < nblocks; bi++)
|
||||||
|
{
|
||||||
|
const InterpBlockView &view = index.views[bi];
|
||||||
|
int bmin[dim], bmax[dim];
|
||||||
|
for (int d = 0; d < dim; d++)
|
||||||
|
{
|
||||||
|
const double low = view.llb[d] - DH[d] / 2;
|
||||||
|
const double up = view.uub[d] + DH[d] / 2;
|
||||||
|
bmin[d] = coord_to_bin(low, index.lo[d], index.inv[d], index.bins[d]);
|
||||||
|
bmax[d] = coord_to_bin(up, index.lo[d], index.inv[d], index.bins[d]);
|
||||||
|
if (bmax[d] < bmin[d])
|
||||||
|
{
|
||||||
|
int t = bmin[d];
|
||||||
|
bmin[d] = bmax[d];
|
||||||
|
bmax[d] = t;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int bz = bmin[2]; bz <= bmax[2]; bz++)
|
||||||
|
for (int by = bmin[1]; by <= bmax[1]; by++)
|
||||||
|
for (int bx = bmin[0]; bx <= bmax[0]; bx++)
|
||||||
|
index.bin_to_blocks[bin_loc(index, bx, by, bz)].push_back(bi);
|
||||||
|
}
|
||||||
|
|
||||||
|
index.valid = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int find_block_index_for_point(const BlockBinIndex &index, const double *pox, const double *DH)
|
||||||
|
{
|
||||||
|
if (!index.valid)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
const int bx = coord_to_bin(pox[0], index.lo[0], index.inv[0], index.bins[0]);
|
||||||
|
const int by = coord_to_bin(pox[1], index.lo[1], index.inv[1], index.bins[1]);
|
||||||
|
const int bz = coord_to_bin(pox[2], index.lo[2], index.inv[2], index.bins[2]);
|
||||||
|
const vector<int> &cand = index.bin_to_blocks[bin_loc(index, bx, by, bz)];
|
||||||
|
|
||||||
|
for (size_t ci = 0; ci < cand.size(); ci++)
|
||||||
|
{
|
||||||
|
const int bi = cand[ci];
|
||||||
|
if (point_in_block_view(index.views[bi], pox, DH))
|
||||||
|
return bi;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fallback to full scan for numerical edge cases around bin boundaries.
|
||||||
|
for (size_t bi = 0; bi < index.views.size(); bi++)
|
||||||
|
if (point_in_block_view(index.views[bi], pox, DH))
|
||||||
|
return int(bi);
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
} // namespace
|
||||||
|
|
||||||
Patch::Patch(int DIM, int *shapei, double *bboxi, int levi, bool buflog, int Symmetry) : lev(levi)
|
Patch::Patch(int DIM, int *shapei, double *bboxi, int levi, bool buflog, int Symmetry) : lev(levi)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -367,9 +530,11 @@ void Patch::Interp_Points(MyList<var> *VarList,
|
|||||||
for (int j = 0; j < NN; j++)
|
for (int j = 0; j < NN; j++)
|
||||||
owner_rank[j] = -1;
|
owner_rank[j] = -1;
|
||||||
|
|
||||||
double DH[dim], llb[dim], uub[dim];
|
double DH[dim];
|
||||||
for (int i = 0; i < dim; i++)
|
for (int i = 0; i < dim; i++)
|
||||||
DH[i] = getdX(i);
|
DH[i] = getdX(i);
|
||||||
|
BlockBinIndex block_index;
|
||||||
|
build_block_bin_index(this, DH, block_index);
|
||||||
|
|
||||||
for (int j = 0; j < NN; j++) // run along points
|
for (int j = 0; j < NN; j++) // run along points
|
||||||
{
|
{
|
||||||
@@ -392,57 +557,24 @@ void Patch::Interp_Points(MyList<var> *VarList,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MyList<Block> *Bp = blb;
|
const int block_i = find_block_index_for_point(block_index, pox, DH);
|
||||||
bool notfind = true;
|
if (block_i >= 0)
|
||||||
while (notfind && Bp) // run along Blocks
|
|
||||||
{
|
{
|
||||||
Block *BP = Bp->data;
|
Block *BP = block_index.views[block_i].bp;
|
||||||
|
owner_rank[j] = BP->rank;
|
||||||
bool flag = true;
|
if (myrank == BP->rank)
|
||||||
for (int i = 0; i < dim; i++)
|
|
||||||
{
|
{
|
||||||
#ifdef Vertex
|
//---> interpolation
|
||||||
#ifdef Cell
|
varl = VarList;
|
||||||
#error Both Cell and Vertex are defined
|
int k = 0;
|
||||||
#endif
|
while (varl) // run along variables
|
||||||
llb[i] = (feq(BP->bbox[i], bbox[i], DH[i] / 2)) ? BP->bbox[i] + lli[i] * DH[i] : BP->bbox[i] + (ghost_width - 0.5) * DH[i];
|
|
||||||
uub[i] = (feq(BP->bbox[dim + i], bbox[dim + i], DH[i] / 2)) ? BP->bbox[dim + i] - uui[i] * DH[i] : BP->bbox[dim + i] - (ghost_width - 0.5) * DH[i];
|
|
||||||
#else
|
|
||||||
#ifdef Cell
|
|
||||||
llb[i] = (feq(BP->bbox[i], bbox[i], DH[i] / 2)) ? BP->bbox[i] + lli[i] * DH[i] : BP->bbox[i] + ghost_width * DH[i];
|
|
||||||
uub[i] = (feq(BP->bbox[dim + i], bbox[dim + i], DH[i] / 2)) ? BP->bbox[dim + i] - uui[i] * DH[i] : BP->bbox[dim + i] - ghost_width * DH[i];
|
|
||||||
#else
|
|
||||||
#error Not define Vertex nor Cell
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
if (XX[i][j] - llb[i] < -DH[i] / 2 || XX[i][j] - uub[i] > DH[i] / 2)
|
|
||||||
{
|
{
|
||||||
flag = false;
|
f_global_interp(BP->shape, BP->X[0], BP->X[1], BP->X[2], BP->fgfs[varl->data->sgfn], Shellf[j * num_var + k],
|
||||||
break;
|
pox[0], pox[1], pox[2], ordn, varl->data->SoA, Symmetry);
|
||||||
|
varl = varl->next;
|
||||||
|
k++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flag)
|
|
||||||
{
|
|
||||||
notfind = false;
|
|
||||||
owner_rank[j] = BP->rank;
|
|
||||||
if (myrank == BP->rank)
|
|
||||||
{
|
|
||||||
//---> interpolation
|
|
||||||
varl = VarList;
|
|
||||||
int k = 0;
|
|
||||||
while (varl) // run along variables
|
|
||||||
{
|
|
||||||
f_global_interp(BP->shape, BP->X[0], BP->X[1], BP->X[2], BP->fgfs[varl->data->sgfn], Shellf[j * num_var + k],
|
|
||||||
pox[0], pox[1], pox[2], ordn, varl->data->SoA, Symmetry);
|
|
||||||
varl = varl->next;
|
|
||||||
k++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (Bp == ble)
|
|
||||||
break;
|
|
||||||
Bp = Bp->next;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -535,9 +667,11 @@ void Patch::Interp_Points(MyList<var> *VarList,
|
|||||||
for (int j = 0; j < NN; j++)
|
for (int j = 0; j < NN; j++)
|
||||||
owner_rank[j] = -1;
|
owner_rank[j] = -1;
|
||||||
|
|
||||||
double DH[dim], llb[dim], uub[dim];
|
double DH[dim];
|
||||||
for (int i = 0; i < dim; i++)
|
for (int i = 0; i < dim; i++)
|
||||||
DH[i] = getdX(i);
|
DH[i] = getdX(i);
|
||||||
|
BlockBinIndex block_index;
|
||||||
|
build_block_bin_index(this, DH, block_index);
|
||||||
|
|
||||||
// --- Interpolation phase (identical to original) ---
|
// --- Interpolation phase (identical to original) ---
|
||||||
for (int j = 0; j < NN; j++)
|
for (int j = 0; j < NN; j++)
|
||||||
@@ -561,56 +695,23 @@ void Patch::Interp_Points(MyList<var> *VarList,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MyList<Block> *Bp = blb;
|
const int block_i = find_block_index_for_point(block_index, pox, DH);
|
||||||
bool notfind = true;
|
if (block_i >= 0)
|
||||||
while (notfind && Bp)
|
|
||||||
{
|
{
|
||||||
Block *BP = Bp->data;
|
Block *BP = block_index.views[block_i].bp;
|
||||||
|
owner_rank[j] = BP->rank;
|
||||||
bool flag = true;
|
if (myrank == BP->rank)
|
||||||
for (int i = 0; i < dim; i++)
|
|
||||||
{
|
{
|
||||||
#ifdef Vertex
|
varl = VarList;
|
||||||
#ifdef Cell
|
int k = 0;
|
||||||
#error Both Cell and Vertex are defined
|
while (varl)
|
||||||
#endif
|
|
||||||
llb[i] = (feq(BP->bbox[i], bbox[i], DH[i] / 2)) ? BP->bbox[i] + lli[i] * DH[i] : BP->bbox[i] + (ghost_width - 0.5) * DH[i];
|
|
||||||
uub[i] = (feq(BP->bbox[dim + i], bbox[dim + i], DH[i] / 2)) ? BP->bbox[dim + i] - uui[i] * DH[i] : BP->bbox[dim + i] - (ghost_width - 0.5) * DH[i];
|
|
||||||
#else
|
|
||||||
#ifdef Cell
|
|
||||||
llb[i] = (feq(BP->bbox[i], bbox[i], DH[i] / 2)) ? BP->bbox[i] + lli[i] * DH[i] : BP->bbox[i] + ghost_width * DH[i];
|
|
||||||
uub[i] = (feq(BP->bbox[dim + i], bbox[dim + i], DH[i] / 2)) ? BP->bbox[dim + i] - uui[i] * DH[i] : BP->bbox[dim + i] - ghost_width * DH[i];
|
|
||||||
#else
|
|
||||||
#error Not define Vertex nor Cell
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
if (XX[i][j] - llb[i] < -DH[i] / 2 || XX[i][j] - uub[i] > DH[i] / 2)
|
|
||||||
{
|
{
|
||||||
flag = false;
|
f_global_interp(BP->shape, BP->X[0], BP->X[1], BP->X[2], BP->fgfs[varl->data->sgfn], Shellf[j * num_var + k],
|
||||||
break;
|
pox[0], pox[1], pox[2], ordn, varl->data->SoA, Symmetry);
|
||||||
|
varl = varl->next;
|
||||||
|
k++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flag)
|
|
||||||
{
|
|
||||||
notfind = false;
|
|
||||||
owner_rank[j] = BP->rank;
|
|
||||||
if (myrank == BP->rank)
|
|
||||||
{
|
|
||||||
varl = VarList;
|
|
||||||
int k = 0;
|
|
||||||
while (varl)
|
|
||||||
{
|
|
||||||
f_global_interp(BP->shape, BP->X[0], BP->X[1], BP->X[2], BP->fgfs[varl->data->sgfn], Shellf[j * num_var + k],
|
|
||||||
pox[0], pox[1], pox[2], ordn, varl->data->SoA, Symmetry);
|
|
||||||
varl = varl->next;
|
|
||||||
k++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (Bp == ble)
|
|
||||||
break;
|
|
||||||
Bp = Bp->next;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -833,9 +934,11 @@ void Patch::Interp_Points(MyList<var> *VarList,
|
|||||||
MPI_Comm_group(MPI_COMM_WORLD, &world_group);
|
MPI_Comm_group(MPI_COMM_WORLD, &world_group);
|
||||||
MPI_Comm_group(Comm_here, &local_group);
|
MPI_Comm_group(Comm_here, &local_group);
|
||||||
|
|
||||||
double DH[dim], llb[dim], uub[dim];
|
double DH[dim];
|
||||||
for (int i = 0; i < dim; i++)
|
for (int i = 0; i < dim; i++)
|
||||||
DH[i] = getdX(i);
|
DH[i] = getdX(i);
|
||||||
|
BlockBinIndex block_index;
|
||||||
|
build_block_bin_index(this, DH, block_index);
|
||||||
|
|
||||||
for (int j = 0; j < NN; j++) // run along points
|
for (int j = 0; j < NN; j++) // run along points
|
||||||
{
|
{
|
||||||
@@ -858,57 +961,24 @@ void Patch::Interp_Points(MyList<var> *VarList,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MyList<Block> *Bp = blb;
|
const int block_i = find_block_index_for_point(block_index, pox, DH);
|
||||||
bool notfind = true;
|
if (block_i >= 0)
|
||||||
while (notfind && Bp) // run along Blocks
|
|
||||||
{
|
{
|
||||||
Block *BP = Bp->data;
|
Block *BP = block_index.views[block_i].bp;
|
||||||
|
owner_rank[j] = BP->rank;
|
||||||
bool flag = true;
|
if (myrank == BP->rank)
|
||||||
for (int i = 0; i < dim; i++)
|
|
||||||
{
|
{
|
||||||
#ifdef Vertex
|
//---> interpolation
|
||||||
#ifdef Cell
|
varl = VarList;
|
||||||
#error Both Cell and Vertex are defined
|
int k = 0;
|
||||||
#endif
|
while (varl) // run along variables
|
||||||
llb[i] = (feq(BP->bbox[i], bbox[i], DH[i] / 2)) ? BP->bbox[i] + lli[i] * DH[i] : BP->bbox[i] + (ghost_width - 0.5) * DH[i];
|
|
||||||
uub[i] = (feq(BP->bbox[dim + i], bbox[dim + i], DH[i] / 2)) ? BP->bbox[dim + i] - uui[i] * DH[i] : BP->bbox[dim + i] - (ghost_width - 0.5) * DH[i];
|
|
||||||
#else
|
|
||||||
#ifdef Cell
|
|
||||||
llb[i] = (feq(BP->bbox[i], bbox[i], DH[i] / 2)) ? BP->bbox[i] + lli[i] * DH[i] : BP->bbox[i] + ghost_width * DH[i];
|
|
||||||
uub[i] = (feq(BP->bbox[dim + i], bbox[dim + i], DH[i] / 2)) ? BP->bbox[dim + i] - uui[i] * DH[i] : BP->bbox[dim + i] - ghost_width * DH[i];
|
|
||||||
#else
|
|
||||||
#error Not define Vertex nor Cell
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
if (XX[i][j] - llb[i] < -DH[i] / 2 || XX[i][j] - uub[i] > DH[i] / 2)
|
|
||||||
{
|
{
|
||||||
flag = false;
|
f_global_interp(BP->shape, BP->X[0], BP->X[1], BP->X[2], BP->fgfs[varl->data->sgfn], Shellf[j * num_var + k],
|
||||||
break;
|
pox[0], pox[1], pox[2], ordn, varl->data->SoA, Symmetry);
|
||||||
|
varl = varl->next;
|
||||||
|
k++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flag)
|
|
||||||
{
|
|
||||||
notfind = false;
|
|
||||||
owner_rank[j] = BP->rank;
|
|
||||||
if (myrank == BP->rank)
|
|
||||||
{
|
|
||||||
//---> interpolation
|
|
||||||
varl = VarList;
|
|
||||||
int k = 0;
|
|
||||||
while (varl) // run along variables
|
|
||||||
{
|
|
||||||
f_global_interp(BP->shape, BP->X[0], BP->X[1], BP->X[2], BP->fgfs[varl->data->sgfn], Shellf[j * num_var + k],
|
|
||||||
pox[0], pox[1], pox[2], ordn, varl->data->SoA, Symmetry);
|
|
||||||
varl = varl->next;
|
|
||||||
k++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (Bp == ble)
|
|
||||||
break;
|
|
||||||
Bp = Bp->next;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3893,66 +3893,105 @@ void Parallel::transfer(MyList<Parallel::gridseg> **src, MyList<Parallel::gridse
|
|||||||
|
|
||||||
int node;
|
int node;
|
||||||
|
|
||||||
MPI_Request *reqs;
|
MPI_Request *reqs = new MPI_Request[2 * cpusize];
|
||||||
MPI_Status *stats;
|
MPI_Status *stats = new MPI_Status[2 * cpusize];
|
||||||
reqs = new MPI_Request[2 * cpusize];
|
int *req_node = new int[2 * cpusize];
|
||||||
stats = new MPI_Status[2 * cpusize];
|
int *req_is_recv = new int[2 * cpusize];
|
||||||
|
int *completed = new int[2 * cpusize];
|
||||||
int req_no = 0;
|
int req_no = 0;
|
||||||
|
int pending_recv = 0;
|
||||||
|
|
||||||
double **send_data, **rec_data;
|
double **send_data = new double *[cpusize];
|
||||||
send_data = new double *[cpusize];
|
double **rec_data = new double *[cpusize];
|
||||||
rec_data = new double *[cpusize];
|
int *send_lengths = new int[cpusize];
|
||||||
int length;
|
int *recv_lengths = new int[cpusize];
|
||||||
|
|
||||||
for (node = 0; node < cpusize; node++)
|
for (node = 0; node < cpusize; node++)
|
||||||
{
|
{
|
||||||
send_data[node] = rec_data[node] = 0;
|
send_data[node] = rec_data[node] = 0;
|
||||||
if (node == myrank)
|
send_lengths[node] = recv_lengths[node] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Post receives first so peers can progress rendezvous early.
|
||||||
|
for (node = 0; node < cpusize; node++)
|
||||||
|
{
|
||||||
|
if (node == myrank) continue;
|
||||||
|
|
||||||
|
recv_lengths[node] = data_packer(0, src[node], dst[node], node, UNPACK, VarList1, VarList2, Symmetry);
|
||||||
|
if (recv_lengths[node] > 0)
|
||||||
{
|
{
|
||||||
if (length = data_packer(0, src[myrank], dst[myrank], node, PACK, VarList1, VarList2, Symmetry))
|
rec_data[node] = new double[recv_lengths[node]];
|
||||||
|
if (!rec_data[node])
|
||||||
{
|
{
|
||||||
rec_data[node] = new double[length];
|
cout << "out of memory when new in short transfer, place 1" << endl;
|
||||||
if (!rec_data[node])
|
MPI_Abort(MPI_COMM_WORLD, 1);
|
||||||
{
|
|
||||||
cout << "out of memory when new in short transfer, place 1" << endl;
|
|
||||||
MPI_Abort(MPI_COMM_WORLD, 1);
|
|
||||||
}
|
|
||||||
data_packer(rec_data[node], src[myrank], dst[myrank], node, PACK, VarList1, VarList2, Symmetry);
|
|
||||||
}
|
}
|
||||||
|
MPI_Irecv((void *)rec_data[node], recv_lengths[node], MPI_DOUBLE, node, 1, MPI_COMM_WORLD, reqs + req_no);
|
||||||
|
req_node[req_no] = node;
|
||||||
|
req_is_recv[req_no] = 1;
|
||||||
|
req_no++;
|
||||||
|
pending_recv++;
|
||||||
}
|
}
|
||||||
else
|
}
|
||||||
|
|
||||||
|
// Local transfer on this rank.
|
||||||
|
recv_lengths[myrank] = data_packer(0, src[myrank], dst[myrank], myrank, PACK, VarList1, VarList2, Symmetry);
|
||||||
|
if (recv_lengths[myrank] > 0)
|
||||||
|
{
|
||||||
|
rec_data[myrank] = new double[recv_lengths[myrank]];
|
||||||
|
if (!rec_data[myrank])
|
||||||
{
|
{
|
||||||
// send from this cpu to cpu#node
|
cout << "out of memory when new in short transfer, place 2" << endl;
|
||||||
if (length = data_packer(0, src[myrank], dst[myrank], node, PACK, VarList1, VarList2, Symmetry))
|
MPI_Abort(MPI_COMM_WORLD, 1);
|
||||||
|
}
|
||||||
|
data_packer(rec_data[myrank], src[myrank], dst[myrank], myrank, PACK, VarList1, VarList2, Symmetry);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pack and post sends.
|
||||||
|
for (node = 0; node < cpusize; node++)
|
||||||
|
{
|
||||||
|
if (node == myrank) continue;
|
||||||
|
|
||||||
|
send_lengths[node] = data_packer(0, src[myrank], dst[myrank], node, PACK, VarList1, VarList2, Symmetry);
|
||||||
|
if (send_lengths[node] > 0)
|
||||||
|
{
|
||||||
|
send_data[node] = new double[send_lengths[node]];
|
||||||
|
if (!send_data[node])
|
||||||
{
|
{
|
||||||
send_data[node] = new double[length];
|
cout << "out of memory when new in short transfer, place 3" << endl;
|
||||||
if (!send_data[node])
|
MPI_Abort(MPI_COMM_WORLD, 1);
|
||||||
{
|
|
||||||
cout << "out of memory when new in short transfer, place 2" << endl;
|
|
||||||
MPI_Abort(MPI_COMM_WORLD, 1);
|
|
||||||
}
|
|
||||||
data_packer(send_data[node], src[myrank], dst[myrank], node, PACK, VarList1, VarList2, Symmetry);
|
|
||||||
MPI_Isend((void *)send_data[node], length, MPI_DOUBLE, node, 1, MPI_COMM_WORLD, reqs + req_no++);
|
|
||||||
}
|
}
|
||||||
// receive from cpu#node to this cpu
|
data_packer(send_data[node], src[myrank], dst[myrank], node, PACK, VarList1, VarList2, Symmetry);
|
||||||
if (length = data_packer(0, src[node], dst[node], node, UNPACK, VarList1, VarList2, Symmetry))
|
MPI_Isend((void *)send_data[node], send_lengths[node], MPI_DOUBLE, node, 1, MPI_COMM_WORLD, reqs + req_no);
|
||||||
|
req_node[req_no] = node;
|
||||||
|
req_is_recv[req_no] = 0;
|
||||||
|
req_no++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unpack as soon as receive completes to reduce pure wait time.
|
||||||
|
while (pending_recv > 0)
|
||||||
|
{
|
||||||
|
int outcount = 0;
|
||||||
|
MPI_Waitsome(req_no, reqs, &outcount, completed, stats);
|
||||||
|
if (outcount == MPI_UNDEFINED) break;
|
||||||
|
|
||||||
|
for (int i = 0; i < outcount; i++)
|
||||||
|
{
|
||||||
|
int idx = completed[i];
|
||||||
|
if (idx >= 0 && req_is_recv[idx])
|
||||||
{
|
{
|
||||||
rec_data[node] = new double[length];
|
int recv_node = req_node[idx];
|
||||||
if (!rec_data[node])
|
data_packer(rec_data[recv_node], src[recv_node], dst[recv_node], recv_node, UNPACK, VarList1, VarList2, Symmetry);
|
||||||
{
|
pending_recv--;
|
||||||
cout << "out of memory when new in short transfer, place 3" << endl;
|
|
||||||
MPI_Abort(MPI_COMM_WORLD, 1);
|
|
||||||
}
|
|
||||||
MPI_Irecv((void *)rec_data[node], length, MPI_DOUBLE, node, 1, MPI_COMM_WORLD, reqs + req_no++);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// wait for all requests to complete
|
|
||||||
MPI_Waitall(req_no, reqs, stats);
|
|
||||||
|
|
||||||
for (node = 0; node < cpusize; node++)
|
if (req_no > 0) MPI_Waitall(req_no, reqs, stats);
|
||||||
if (rec_data[node])
|
|
||||||
data_packer(rec_data[node], src[node], dst[node], node, UNPACK, VarList1, VarList2, Symmetry);
|
if (rec_data[myrank])
|
||||||
|
data_packer(rec_data[myrank], src[myrank], dst[myrank], myrank, UNPACK, VarList1, VarList2, Symmetry);
|
||||||
|
|
||||||
for (node = 0; node < cpusize; node++)
|
for (node = 0; node < cpusize; node++)
|
||||||
{
|
{
|
||||||
@@ -3964,8 +4003,13 @@ void Parallel::transfer(MyList<Parallel::gridseg> **src, MyList<Parallel::gridse
|
|||||||
|
|
||||||
delete[] reqs;
|
delete[] reqs;
|
||||||
delete[] stats;
|
delete[] stats;
|
||||||
|
delete[] req_node;
|
||||||
|
delete[] req_is_recv;
|
||||||
|
delete[] completed;
|
||||||
delete[] send_data;
|
delete[] send_data;
|
||||||
delete[] rec_data;
|
delete[] rec_data;
|
||||||
|
delete[] send_lengths;
|
||||||
|
delete[] recv_lengths;
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
void Parallel::transfermix(MyList<Parallel::gridseg> **src, MyList<Parallel::gridseg> **dst,
|
void Parallel::transfermix(MyList<Parallel::gridseg> **src, MyList<Parallel::gridseg> **dst,
|
||||||
@@ -3978,66 +4022,105 @@ void Parallel::transfermix(MyList<Parallel::gridseg> **src, MyList<Parallel::gri
|
|||||||
|
|
||||||
int node;
|
int node;
|
||||||
|
|
||||||
MPI_Request *reqs;
|
MPI_Request *reqs = new MPI_Request[2 * cpusize];
|
||||||
MPI_Status *stats;
|
MPI_Status *stats = new MPI_Status[2 * cpusize];
|
||||||
reqs = new MPI_Request[2 * cpusize];
|
int *req_node = new int[2 * cpusize];
|
||||||
stats = new MPI_Status[2 * cpusize];
|
int *req_is_recv = new int[2 * cpusize];
|
||||||
|
int *completed = new int[2 * cpusize];
|
||||||
int req_no = 0;
|
int req_no = 0;
|
||||||
|
int pending_recv = 0;
|
||||||
|
|
||||||
double **send_data, **rec_data;
|
double **send_data = new double *[cpusize];
|
||||||
send_data = new double *[cpusize];
|
double **rec_data = new double *[cpusize];
|
||||||
rec_data = new double *[cpusize];
|
int *send_lengths = new int[cpusize];
|
||||||
int length;
|
int *recv_lengths = new int[cpusize];
|
||||||
|
|
||||||
for (node = 0; node < cpusize; node++)
|
for (node = 0; node < cpusize; node++)
|
||||||
{
|
{
|
||||||
send_data[node] = rec_data[node] = 0;
|
send_data[node] = rec_data[node] = 0;
|
||||||
if (node == myrank)
|
send_lengths[node] = recv_lengths[node] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Post receives first so peers can progress rendezvous early.
|
||||||
|
for (node = 0; node < cpusize; node++)
|
||||||
|
{
|
||||||
|
if (node == myrank) continue;
|
||||||
|
|
||||||
|
recv_lengths[node] = data_packermix(0, src[node], dst[node], node, UNPACK, VarList1, VarList2, Symmetry);
|
||||||
|
if (recv_lengths[node] > 0)
|
||||||
{
|
{
|
||||||
if (length = data_packermix(0, src[myrank], dst[myrank], node, PACK, VarList1, VarList2, Symmetry))
|
rec_data[node] = new double[recv_lengths[node]];
|
||||||
|
if (!rec_data[node])
|
||||||
{
|
{
|
||||||
rec_data[node] = new double[length];
|
cout << "out of memory when new in short transfer, place 1" << endl;
|
||||||
if (!rec_data[node])
|
MPI_Abort(MPI_COMM_WORLD, 1);
|
||||||
{
|
|
||||||
cout << "out of memory when new in short transfer, place 1" << endl;
|
|
||||||
MPI_Abort(MPI_COMM_WORLD, 1);
|
|
||||||
}
|
|
||||||
data_packermix(rec_data[node], src[myrank], dst[myrank], node, PACK, VarList1, VarList2, Symmetry);
|
|
||||||
}
|
}
|
||||||
|
MPI_Irecv((void *)rec_data[node], recv_lengths[node], MPI_DOUBLE, node, 1, MPI_COMM_WORLD, reqs + req_no);
|
||||||
|
req_node[req_no] = node;
|
||||||
|
req_is_recv[req_no] = 1;
|
||||||
|
req_no++;
|
||||||
|
pending_recv++;
|
||||||
}
|
}
|
||||||
else
|
}
|
||||||
|
|
||||||
|
// Local transfer on this rank.
|
||||||
|
recv_lengths[myrank] = data_packermix(0, src[myrank], dst[myrank], myrank, PACK, VarList1, VarList2, Symmetry);
|
||||||
|
if (recv_lengths[myrank] > 0)
|
||||||
|
{
|
||||||
|
rec_data[myrank] = new double[recv_lengths[myrank]];
|
||||||
|
if (!rec_data[myrank])
|
||||||
{
|
{
|
||||||
// send from this cpu to cpu#node
|
cout << "out of memory when new in short transfer, place 2" << endl;
|
||||||
if (length = data_packermix(0, src[myrank], dst[myrank], node, PACK, VarList1, VarList2, Symmetry))
|
MPI_Abort(MPI_COMM_WORLD, 1);
|
||||||
|
}
|
||||||
|
data_packermix(rec_data[myrank], src[myrank], dst[myrank], myrank, PACK, VarList1, VarList2, Symmetry);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pack and post sends.
|
||||||
|
for (node = 0; node < cpusize; node++)
|
||||||
|
{
|
||||||
|
if (node == myrank) continue;
|
||||||
|
|
||||||
|
send_lengths[node] = data_packermix(0, src[myrank], dst[myrank], node, PACK, VarList1, VarList2, Symmetry);
|
||||||
|
if (send_lengths[node] > 0)
|
||||||
|
{
|
||||||
|
send_data[node] = new double[send_lengths[node]];
|
||||||
|
if (!send_data[node])
|
||||||
{
|
{
|
||||||
send_data[node] = new double[length];
|
cout << "out of memory when new in short transfer, place 3" << endl;
|
||||||
if (!send_data[node])
|
MPI_Abort(MPI_COMM_WORLD, 1);
|
||||||
{
|
|
||||||
cout << "out of memory when new in short transfer, place 2" << endl;
|
|
||||||
MPI_Abort(MPI_COMM_WORLD, 1);
|
|
||||||
}
|
|
||||||
data_packermix(send_data[node], src[myrank], dst[myrank], node, PACK, VarList1, VarList2, Symmetry);
|
|
||||||
MPI_Isend((void *)send_data[node], length, MPI_DOUBLE, node, 1, MPI_COMM_WORLD, reqs + req_no++);
|
|
||||||
}
|
}
|
||||||
// receive from cpu#node to this cpu
|
data_packermix(send_data[node], src[myrank], dst[myrank], node, PACK, VarList1, VarList2, Symmetry);
|
||||||
if (length = data_packermix(0, src[node], dst[node], node, UNPACK, VarList1, VarList2, Symmetry))
|
MPI_Isend((void *)send_data[node], send_lengths[node], MPI_DOUBLE, node, 1, MPI_COMM_WORLD, reqs + req_no);
|
||||||
|
req_node[req_no] = node;
|
||||||
|
req_is_recv[req_no] = 0;
|
||||||
|
req_no++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unpack as soon as receive completes to reduce pure wait time.
|
||||||
|
while (pending_recv > 0)
|
||||||
|
{
|
||||||
|
int outcount = 0;
|
||||||
|
MPI_Waitsome(req_no, reqs, &outcount, completed, stats);
|
||||||
|
if (outcount == MPI_UNDEFINED) break;
|
||||||
|
|
||||||
|
for (int i = 0; i < outcount; i++)
|
||||||
|
{
|
||||||
|
int idx = completed[i];
|
||||||
|
if (idx >= 0 && req_is_recv[idx])
|
||||||
{
|
{
|
||||||
rec_data[node] = new double[length];
|
int recv_node = req_node[idx];
|
||||||
if (!rec_data[node])
|
data_packermix(rec_data[recv_node], src[recv_node], dst[recv_node], recv_node, UNPACK, VarList1, VarList2, Symmetry);
|
||||||
{
|
pending_recv--;
|
||||||
cout << "out of memory when new in short transfer, place 3" << endl;
|
|
||||||
MPI_Abort(MPI_COMM_WORLD, 1);
|
|
||||||
}
|
|
||||||
MPI_Irecv((void *)rec_data[node], length, MPI_DOUBLE, node, 1, MPI_COMM_WORLD, reqs + req_no++);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// wait for all requests to complete
|
|
||||||
MPI_Waitall(req_no, reqs, stats);
|
|
||||||
|
|
||||||
for (node = 0; node < cpusize; node++)
|
if (req_no > 0) MPI_Waitall(req_no, reqs, stats);
|
||||||
if (rec_data[node])
|
|
||||||
data_packermix(rec_data[node], src[node], dst[node], node, UNPACK, VarList1, VarList2, Symmetry);
|
if (rec_data[myrank])
|
||||||
|
data_packermix(rec_data[myrank], src[myrank], dst[myrank], myrank, UNPACK, VarList1, VarList2, Symmetry);
|
||||||
|
|
||||||
for (node = 0; node < cpusize; node++)
|
for (node = 0; node < cpusize; node++)
|
||||||
{
|
{
|
||||||
@@ -4049,8 +4132,13 @@ void Parallel::transfermix(MyList<Parallel::gridseg> **src, MyList<Parallel::gri
|
|||||||
|
|
||||||
delete[] reqs;
|
delete[] reqs;
|
||||||
delete[] stats;
|
delete[] stats;
|
||||||
|
delete[] req_node;
|
||||||
|
delete[] req_is_recv;
|
||||||
|
delete[] completed;
|
||||||
delete[] send_data;
|
delete[] send_data;
|
||||||
delete[] rec_data;
|
delete[] rec_data;
|
||||||
|
delete[] send_lengths;
|
||||||
|
delete[] recv_lengths;
|
||||||
}
|
}
|
||||||
void Parallel::Sync(Patch *Pat, MyList<var> *VarList, int Symmetry)
|
void Parallel::Sync(Patch *Pat, MyList<var> *VarList, int Symmetry)
|
||||||
{
|
{
|
||||||
@@ -4232,7 +4320,7 @@ Parallel::SyncCache::SyncCache()
|
|||||||
: valid(false), cpusize(0), combined_src(0), combined_dst(0),
|
: valid(false), cpusize(0), combined_src(0), combined_dst(0),
|
||||||
send_lengths(0), recv_lengths(0), send_bufs(0), recv_bufs(0),
|
send_lengths(0), recv_lengths(0), send_bufs(0), recv_bufs(0),
|
||||||
send_buf_caps(0), recv_buf_caps(0), reqs(0), stats(0), max_reqs(0),
|
send_buf_caps(0), recv_buf_caps(0), reqs(0), stats(0), max_reqs(0),
|
||||||
lengths_valid(false)
|
lengths_valid(false), tc_req_node(0), tc_req_is_recv(0), tc_completed(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
// SyncCache invalidate: free grid segment lists but keep buffers
|
// SyncCache invalidate: free grid segment lists but keep buffers
|
||||||
@@ -4271,11 +4359,15 @@ void Parallel::SyncCache::destroy()
|
|||||||
if (recv_bufs) delete[] recv_bufs;
|
if (recv_bufs) delete[] recv_bufs;
|
||||||
if (reqs) delete[] reqs;
|
if (reqs) delete[] reqs;
|
||||||
if (stats) delete[] stats;
|
if (stats) delete[] stats;
|
||||||
|
if (tc_req_node) delete[] tc_req_node;
|
||||||
|
if (tc_req_is_recv) delete[] tc_req_is_recv;
|
||||||
|
if (tc_completed) delete[] tc_completed;
|
||||||
combined_src = combined_dst = 0;
|
combined_src = combined_dst = 0;
|
||||||
send_lengths = recv_lengths = 0;
|
send_lengths = recv_lengths = 0;
|
||||||
send_buf_caps = recv_buf_caps = 0;
|
send_buf_caps = recv_buf_caps = 0;
|
||||||
send_bufs = recv_bufs = 0;
|
send_bufs = recv_bufs = 0;
|
||||||
reqs = 0; stats = 0;
|
reqs = 0; stats = 0;
|
||||||
|
tc_req_node = 0; tc_req_is_recv = 0; tc_completed = 0;
|
||||||
cpusize = 0; max_reqs = 0;
|
cpusize = 0; max_reqs = 0;
|
||||||
}
|
}
|
||||||
// transfer_cached: reuse pre-allocated buffers from SyncCache
|
// transfer_cached: reuse pre-allocated buffers from SyncCache
|
||||||
@@ -4289,64 +4381,96 @@ void Parallel::transfer_cached(MyList<Parallel::gridseg> **src, MyList<Parallel:
|
|||||||
int cpusize = cache.cpusize;
|
int cpusize = cache.cpusize;
|
||||||
|
|
||||||
int req_no = 0;
|
int req_no = 0;
|
||||||
|
int pending_recv = 0;
|
||||||
int node;
|
int node;
|
||||||
|
int *req_node = cache.tc_req_node;
|
||||||
|
int *req_is_recv = cache.tc_req_is_recv;
|
||||||
|
int *completed = cache.tc_completed;
|
||||||
|
|
||||||
|
// Post receives first so peers can progress rendezvous early.
|
||||||
for (node = 0; node < cpusize; node++)
|
for (node = 0; node < cpusize; node++)
|
||||||
{
|
{
|
||||||
if (node == myrank)
|
if (node == myrank) continue;
|
||||||
|
|
||||||
|
int rlength = data_packer(0, src[node], dst[node], node, UNPACK, VarList1, VarList2, Symmetry);
|
||||||
|
cache.recv_lengths[node] = rlength;
|
||||||
|
if (rlength > 0)
|
||||||
{
|
{
|
||||||
int length = data_packer(0, src[myrank], dst[myrank], node, PACK, VarList1, VarList2, Symmetry);
|
if (rlength > cache.recv_buf_caps[node])
|
||||||
cache.recv_lengths[node] = length;
|
|
||||||
if (length > 0)
|
|
||||||
{
|
{
|
||||||
if (length > cache.recv_buf_caps[node])
|
if (cache.recv_bufs[node]) delete[] cache.recv_bufs[node];
|
||||||
{
|
cache.recv_bufs[node] = new double[rlength];
|
||||||
if (cache.recv_bufs[node]) delete[] cache.recv_bufs[node];
|
cache.recv_buf_caps[node] = rlength;
|
||||||
cache.recv_bufs[node] = new double[length];
|
|
||||||
cache.recv_buf_caps[node] = length;
|
|
||||||
}
|
|
||||||
data_packer(cache.recv_bufs[node], src[myrank], dst[myrank], node, PACK, VarList1, VarList2, Symmetry);
|
|
||||||
}
|
}
|
||||||
|
MPI_Irecv((void *)cache.recv_bufs[node], rlength, MPI_DOUBLE, node, 1, MPI_COMM_WORLD, cache.reqs + req_no);
|
||||||
|
req_node[req_no] = node;
|
||||||
|
req_is_recv[req_no] = 1;
|
||||||
|
req_no++;
|
||||||
|
pending_recv++;
|
||||||
}
|
}
|
||||||
else
|
}
|
||||||
|
|
||||||
|
// Local transfer on this rank.
|
||||||
|
int self_len = data_packer(0, src[myrank], dst[myrank], myrank, PACK, VarList1, VarList2, Symmetry);
|
||||||
|
cache.recv_lengths[myrank] = self_len;
|
||||||
|
if (self_len > 0)
|
||||||
|
{
|
||||||
|
if (self_len > cache.recv_buf_caps[myrank])
|
||||||
{
|
{
|
||||||
// send
|
if (cache.recv_bufs[myrank]) delete[] cache.recv_bufs[myrank];
|
||||||
int slength = data_packer(0, src[myrank], dst[myrank], node, PACK, VarList1, VarList2, Symmetry);
|
cache.recv_bufs[myrank] = new double[self_len];
|
||||||
cache.send_lengths[node] = slength;
|
cache.recv_buf_caps[myrank] = self_len;
|
||||||
if (slength > 0)
|
}
|
||||||
|
data_packer(cache.recv_bufs[myrank], src[myrank], dst[myrank], myrank, PACK, VarList1, VarList2, Symmetry);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pack and post sends.
|
||||||
|
for (node = 0; node < cpusize; node++)
|
||||||
|
{
|
||||||
|
if (node == myrank) continue;
|
||||||
|
|
||||||
|
int slength = data_packer(0, src[myrank], dst[myrank], node, PACK, VarList1, VarList2, Symmetry);
|
||||||
|
cache.send_lengths[node] = slength;
|
||||||
|
if (slength > 0)
|
||||||
|
{
|
||||||
|
if (slength > cache.send_buf_caps[node])
|
||||||
{
|
{
|
||||||
if (slength > cache.send_buf_caps[node])
|
if (cache.send_bufs[node]) delete[] cache.send_bufs[node];
|
||||||
{
|
cache.send_bufs[node] = new double[slength];
|
||||||
if (cache.send_bufs[node]) delete[] cache.send_bufs[node];
|
cache.send_buf_caps[node] = slength;
|
||||||
cache.send_bufs[node] = new double[slength];
|
|
||||||
cache.send_buf_caps[node] = slength;
|
|
||||||
}
|
|
||||||
data_packer(cache.send_bufs[node], src[myrank], dst[myrank], node, PACK, VarList1, VarList2, Symmetry);
|
|
||||||
MPI_Isend((void *)cache.send_bufs[node], slength, MPI_DOUBLE, node, 1, MPI_COMM_WORLD, cache.reqs + req_no++);
|
|
||||||
}
|
}
|
||||||
// recv
|
data_packer(cache.send_bufs[node], src[myrank], dst[myrank], node, PACK, VarList1, VarList2, Symmetry);
|
||||||
int rlength = data_packer(0, src[node], dst[node], node, UNPACK, VarList1, VarList2, Symmetry);
|
MPI_Isend((void *)cache.send_bufs[node], slength, MPI_DOUBLE, node, 1, MPI_COMM_WORLD, cache.reqs + req_no);
|
||||||
cache.recv_lengths[node] = rlength;
|
req_node[req_no] = node;
|
||||||
if (rlength > 0)
|
req_is_recv[req_no] = 0;
|
||||||
|
req_no++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unpack as soon as receive completes to reduce pure wait time.
|
||||||
|
while (pending_recv > 0)
|
||||||
|
{
|
||||||
|
int outcount = 0;
|
||||||
|
MPI_Waitsome(req_no, cache.reqs, &outcount, completed, cache.stats);
|
||||||
|
if (outcount == MPI_UNDEFINED) break;
|
||||||
|
|
||||||
|
for (int i = 0; i < outcount; i++)
|
||||||
|
{
|
||||||
|
int idx = completed[i];
|
||||||
|
if (idx >= 0 && req_is_recv[idx])
|
||||||
{
|
{
|
||||||
if (rlength > cache.recv_buf_caps[node])
|
int recv_node_i = req_node[idx];
|
||||||
{
|
data_packer(cache.recv_bufs[recv_node_i], src[recv_node_i], dst[recv_node_i], recv_node_i, UNPACK, VarList1, VarList2, Symmetry);
|
||||||
if (cache.recv_bufs[node]) delete[] cache.recv_bufs[node];
|
pending_recv--;
|
||||||
cache.recv_bufs[node] = new double[rlength];
|
|
||||||
cache.recv_buf_caps[node] = rlength;
|
|
||||||
}
|
|
||||||
MPI_Irecv((void *)cache.recv_bufs[node], rlength, MPI_DOUBLE, node, 1, MPI_COMM_WORLD, cache.reqs + req_no++);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MPI_Waitall(req_no, cache.reqs, cache.stats);
|
if (req_no > 0) MPI_Waitall(req_no, cache.reqs, cache.stats);
|
||||||
|
|
||||||
for (node = 0; node < cpusize; node++)
|
if (self_len > 0)
|
||||||
if (cache.recv_bufs[node] && cache.recv_lengths[node] > 0)
|
data_packer(cache.recv_bufs[myrank], src[myrank], dst[myrank], myrank, UNPACK, VarList1, VarList2, Symmetry);
|
||||||
data_packer(cache.recv_bufs[node], src[node], dst[node], node, UNPACK, VarList1, VarList2, Symmetry);
|
|
||||||
}
|
}
|
||||||
// Sync_cached: build grid segment lists on first call, reuse on subsequent calls
|
|
||||||
void Parallel::Sync_cached(MyList<Patch> *PatL, MyList<var> *VarList, int Symmetry, SyncCache &cache)
|
void Parallel::Sync_cached(MyList<Patch> *PatL, MyList<var> *VarList, int Symmetry, SyncCache &cache)
|
||||||
{
|
{
|
||||||
if (!cache.valid)
|
if (!cache.valid)
|
||||||
@@ -4374,6 +4498,9 @@ void Parallel::Sync_cached(MyList<Patch> *PatL, MyList<var> *VarList, int Symmet
|
|||||||
cache.max_reqs = 2 * cpusize;
|
cache.max_reqs = 2 * cpusize;
|
||||||
cache.reqs = new MPI_Request[cache.max_reqs];
|
cache.reqs = new MPI_Request[cache.max_reqs];
|
||||||
cache.stats = new MPI_Status[cache.max_reqs];
|
cache.stats = new MPI_Status[cache.max_reqs];
|
||||||
|
cache.tc_req_node = new int[cache.max_reqs];
|
||||||
|
cache.tc_req_is_recv = new int[cache.max_reqs];
|
||||||
|
cache.tc_completed = new int[cache.max_reqs];
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int node = 0; node < cpusize; node++)
|
for (int node = 0; node < cpusize; node++)
|
||||||
@@ -4474,6 +4601,9 @@ void Parallel::Sync_start(MyList<Patch> *PatL, MyList<var> *VarList, int Symmetr
|
|||||||
cache.max_reqs = 2 * cpusize;
|
cache.max_reqs = 2 * cpusize;
|
||||||
cache.reqs = new MPI_Request[cache.max_reqs];
|
cache.reqs = new MPI_Request[cache.max_reqs];
|
||||||
cache.stats = new MPI_Status[cache.max_reqs];
|
cache.stats = new MPI_Status[cache.max_reqs];
|
||||||
|
cache.tc_req_node = new int[cache.max_reqs];
|
||||||
|
cache.tc_req_is_recv = new int[cache.max_reqs];
|
||||||
|
cache.tc_completed = new int[cache.max_reqs];
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int node = 0; node < cpusize; node++)
|
for (int node = 0; node < cpusize; node++)
|
||||||
@@ -4544,6 +4674,11 @@ void Parallel::Sync_start(MyList<Patch> *PatL, MyList<var> *VarList, int Symmetr
|
|||||||
int cpusize = cache.cpusize;
|
int cpusize = cache.cpusize;
|
||||||
state.req_no = 0;
|
state.req_no = 0;
|
||||||
state.active = true;
|
state.active = true;
|
||||||
|
state.pending_recv = 0;
|
||||||
|
// Allocate tracking arrays
|
||||||
|
delete[] state.req_node; delete[] state.req_is_recv;
|
||||||
|
state.req_node = new int[cache.max_reqs];
|
||||||
|
state.req_is_recv = new int[cache.max_reqs];
|
||||||
|
|
||||||
MyList<Parallel::gridseg> **src = cache.combined_src;
|
MyList<Parallel::gridseg> **src = cache.combined_src;
|
||||||
MyList<Parallel::gridseg> **dst = cache.combined_dst;
|
MyList<Parallel::gridseg> **dst = cache.combined_dst;
|
||||||
@@ -4588,6 +4723,8 @@ void Parallel::Sync_start(MyList<Patch> *PatL, MyList<var> *VarList, int Symmetr
|
|||||||
cache.send_buf_caps[node] = slength;
|
cache.send_buf_caps[node] = slength;
|
||||||
}
|
}
|
||||||
data_packer(cache.send_bufs[node], src[myrank], dst[myrank], node, PACK, VarList, VarList, Symmetry);
|
data_packer(cache.send_bufs[node], src[myrank], dst[myrank], node, PACK, VarList, VarList, Symmetry);
|
||||||
|
state.req_node[state.req_no] = node;
|
||||||
|
state.req_is_recv[state.req_no] = 0;
|
||||||
MPI_Isend((void *)cache.send_bufs[node], slength, MPI_DOUBLE, node, 2, MPI_COMM_WORLD, cache.reqs + state.req_no++);
|
MPI_Isend((void *)cache.send_bufs[node], slength, MPI_DOUBLE, node, 2, MPI_COMM_WORLD, cache.reqs + state.req_no++);
|
||||||
}
|
}
|
||||||
int rlength;
|
int rlength;
|
||||||
@@ -4605,29 +4742,60 @@ void Parallel::Sync_start(MyList<Patch> *PatL, MyList<var> *VarList, int Symmetr
|
|||||||
cache.recv_bufs[node] = new double[rlength];
|
cache.recv_bufs[node] = new double[rlength];
|
||||||
cache.recv_buf_caps[node] = rlength;
|
cache.recv_buf_caps[node] = rlength;
|
||||||
}
|
}
|
||||||
|
state.req_node[state.req_no] = node;
|
||||||
|
state.req_is_recv[state.req_no] = 1;
|
||||||
|
state.pending_recv++;
|
||||||
MPI_Irecv((void *)cache.recv_bufs[node], rlength, MPI_DOUBLE, node, 2, MPI_COMM_WORLD, cache.reqs + state.req_no++);
|
MPI_Irecv((void *)cache.recv_bufs[node], rlength, MPI_DOUBLE, node, 2, MPI_COMM_WORLD, cache.reqs + state.req_no++);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cache.lengths_valid = true;
|
cache.lengths_valid = true;
|
||||||
}
|
}
|
||||||
// Sync_finish: wait for async MPI operations and unpack
|
// Sync_finish: progressive unpack as receives complete, then wait for sends
|
||||||
void Parallel::Sync_finish(SyncCache &cache, AsyncSyncState &state,
|
void Parallel::Sync_finish(SyncCache &cache, AsyncSyncState &state,
|
||||||
MyList<var> *VarList, int Symmetry)
|
MyList<var> *VarList, int Symmetry)
|
||||||
{
|
{
|
||||||
if (!state.active)
|
if (!state.active)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
MPI_Waitall(state.req_no, cache.reqs, cache.stats);
|
int myrank;
|
||||||
|
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
|
||||||
int cpusize = cache.cpusize;
|
|
||||||
MyList<Parallel::gridseg> **src = cache.combined_src;
|
MyList<Parallel::gridseg> **src = cache.combined_src;
|
||||||
MyList<Parallel::gridseg> **dst = cache.combined_dst;
|
MyList<Parallel::gridseg> **dst = cache.combined_dst;
|
||||||
|
|
||||||
for (int node = 0; node < cpusize; node++)
|
// Unpack local data first (no MPI needed)
|
||||||
if (cache.recv_bufs[node] && cache.recv_lengths[node] > 0)
|
if (cache.recv_bufs[myrank] && cache.recv_lengths[myrank] > 0)
|
||||||
data_packer(cache.recv_bufs[node], src[node], dst[node], node, UNPACK, VarList, VarList, Symmetry);
|
data_packer(cache.recv_bufs[myrank], src[myrank], dst[myrank], myrank, UNPACK, VarList, VarList, Symmetry);
|
||||||
|
|
||||||
|
// Progressive unpack of remote receives
|
||||||
|
if (state.pending_recv > 0 && state.req_no > 0)
|
||||||
|
{
|
||||||
|
int pending = state.pending_recv;
|
||||||
|
int *completed = new int[cache.max_reqs];
|
||||||
|
while (pending > 0)
|
||||||
|
{
|
||||||
|
int outcount = 0;
|
||||||
|
MPI_Waitsome(state.req_no, cache.reqs, &outcount, completed, cache.stats);
|
||||||
|
if (outcount == MPI_UNDEFINED) break;
|
||||||
|
for (int i = 0; i < outcount; i++)
|
||||||
|
{
|
||||||
|
int idx = completed[i];
|
||||||
|
if (idx >= 0 && state.req_is_recv[idx])
|
||||||
|
{
|
||||||
|
int recv_node = state.req_node[idx];
|
||||||
|
data_packer(cache.recv_bufs[recv_node], src[recv_node], dst[recv_node], recv_node, UNPACK, VarList, VarList, Symmetry);
|
||||||
|
pending--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
delete[] completed;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for remaining sends
|
||||||
|
if (state.req_no > 0) MPI_Waitall(state.req_no, cache.reqs, cache.stats);
|
||||||
|
|
||||||
|
delete[] state.req_node; state.req_node = 0;
|
||||||
|
delete[] state.req_is_recv; state.req_is_recv = 0;
|
||||||
state.active = false;
|
state.active = false;
|
||||||
}
|
}
|
||||||
// collect buffer grid segments or blocks for the periodic boundary condition of given patch
|
// collect buffer grid segments or blocks for the periodic boundary condition of given patch
|
||||||
@@ -5694,6 +5862,9 @@ void Parallel::Restrict_cached(MyList<Patch> *PatcL, MyList<Patch> *PatfL,
|
|||||||
cache.max_reqs = 2 * cpusize;
|
cache.max_reqs = 2 * cpusize;
|
||||||
cache.reqs = new MPI_Request[cache.max_reqs];
|
cache.reqs = new MPI_Request[cache.max_reqs];
|
||||||
cache.stats = new MPI_Status[cache.max_reqs];
|
cache.stats = new MPI_Status[cache.max_reqs];
|
||||||
|
cache.tc_req_node = new int[cache.max_reqs];
|
||||||
|
cache.tc_req_is_recv = new int[cache.max_reqs];
|
||||||
|
cache.tc_completed = new int[cache.max_reqs];
|
||||||
}
|
}
|
||||||
|
|
||||||
MyList<Parallel::gridseg> *dst = build_complete_gsl(PatcL);
|
MyList<Parallel::gridseg> *dst = build_complete_gsl(PatcL);
|
||||||
@@ -5740,6 +5911,9 @@ void Parallel::OutBdLow2Hi_cached(MyList<Patch> *PatcL, MyList<Patch> *PatfL,
|
|||||||
cache.max_reqs = 2 * cpusize;
|
cache.max_reqs = 2 * cpusize;
|
||||||
cache.reqs = new MPI_Request[cache.max_reqs];
|
cache.reqs = new MPI_Request[cache.max_reqs];
|
||||||
cache.stats = new MPI_Status[cache.max_reqs];
|
cache.stats = new MPI_Status[cache.max_reqs];
|
||||||
|
cache.tc_req_node = new int[cache.max_reqs];
|
||||||
|
cache.tc_req_is_recv = new int[cache.max_reqs];
|
||||||
|
cache.tc_completed = new int[cache.max_reqs];
|
||||||
}
|
}
|
||||||
|
|
||||||
MyList<Parallel::gridseg> *dst = build_buffer_gsl(PatfL);
|
MyList<Parallel::gridseg> *dst = build_buffer_gsl(PatfL);
|
||||||
@@ -5786,6 +5960,9 @@ void Parallel::OutBdLow2Himix_cached(MyList<Patch> *PatcL, MyList<Patch> *PatfL,
|
|||||||
cache.max_reqs = 2 * cpusize;
|
cache.max_reqs = 2 * cpusize;
|
||||||
cache.reqs = new MPI_Request[cache.max_reqs];
|
cache.reqs = new MPI_Request[cache.max_reqs];
|
||||||
cache.stats = new MPI_Status[cache.max_reqs];
|
cache.stats = new MPI_Status[cache.max_reqs];
|
||||||
|
cache.tc_req_node = new int[cache.max_reqs];
|
||||||
|
cache.tc_req_is_recv = new int[cache.max_reqs];
|
||||||
|
cache.tc_completed = new int[cache.max_reqs];
|
||||||
}
|
}
|
||||||
|
|
||||||
MyList<Parallel::gridseg> *dst = build_buffer_gsl(PatfL);
|
MyList<Parallel::gridseg> *dst = build_buffer_gsl(PatfL);
|
||||||
@@ -5807,58 +5984,98 @@ void Parallel::OutBdLow2Himix_cached(MyList<Patch> *PatcL, MyList<Patch> *PatfL,
|
|||||||
int cpusize = cache.cpusize;
|
int cpusize = cache.cpusize;
|
||||||
|
|
||||||
int req_no = 0;
|
int req_no = 0;
|
||||||
|
int pending_recv = 0;
|
||||||
|
int *req_node = new int[cache.max_reqs];
|
||||||
|
int *req_is_recv = new int[cache.max_reqs];
|
||||||
|
int *completed = new int[cache.max_reqs];
|
||||||
|
|
||||||
|
// Post receives first so peers can progress rendezvous early.
|
||||||
for (int node = 0; node < cpusize; node++)
|
for (int node = 0; node < cpusize; node++)
|
||||||
{
|
{
|
||||||
if (node == myrank)
|
if (node == myrank) continue;
|
||||||
|
|
||||||
|
int rlength = data_packermix(0, cache.combined_src[node], cache.combined_dst[node], node, UNPACK, VarList1, VarList2, Symmetry);
|
||||||
|
cache.recv_lengths[node] = rlength;
|
||||||
|
if (rlength > 0)
|
||||||
{
|
{
|
||||||
int length = data_packermix(0, cache.combined_src[myrank], cache.combined_dst[myrank], node, PACK, VarList1, VarList2, Symmetry);
|
if (rlength > cache.recv_buf_caps[node])
|
||||||
cache.recv_lengths[node] = length;
|
|
||||||
if (length > 0)
|
|
||||||
{
|
{
|
||||||
if (length > cache.recv_buf_caps[node])
|
if (cache.recv_bufs[node]) delete[] cache.recv_bufs[node];
|
||||||
{
|
cache.recv_bufs[node] = new double[rlength];
|
||||||
if (cache.recv_bufs[node]) delete[] cache.recv_bufs[node];
|
cache.recv_buf_caps[node] = rlength;
|
||||||
cache.recv_bufs[node] = new double[length];
|
|
||||||
cache.recv_buf_caps[node] = length;
|
|
||||||
}
|
|
||||||
data_packermix(cache.recv_bufs[node], cache.combined_src[myrank], cache.combined_dst[myrank], node, PACK, VarList1, VarList2, Symmetry);
|
|
||||||
}
|
}
|
||||||
|
MPI_Irecv((void *)cache.recv_bufs[node], rlength, MPI_DOUBLE, node, 1, MPI_COMM_WORLD, cache.reqs + req_no);
|
||||||
|
req_node[req_no] = node;
|
||||||
|
req_is_recv[req_no] = 1;
|
||||||
|
req_no++;
|
||||||
|
pending_recv++;
|
||||||
}
|
}
|
||||||
else
|
}
|
||||||
|
|
||||||
|
// Local transfer on this rank.
|
||||||
|
int self_len = data_packermix(0, cache.combined_src[myrank], cache.combined_dst[myrank], myrank, PACK, VarList1, VarList2, Symmetry);
|
||||||
|
cache.recv_lengths[myrank] = self_len;
|
||||||
|
if (self_len > 0)
|
||||||
|
{
|
||||||
|
if (self_len > cache.recv_buf_caps[myrank])
|
||||||
{
|
{
|
||||||
int slength = data_packermix(0, cache.combined_src[myrank], cache.combined_dst[myrank], node, PACK, VarList1, VarList2, Symmetry);
|
if (cache.recv_bufs[myrank]) delete[] cache.recv_bufs[myrank];
|
||||||
cache.send_lengths[node] = slength;
|
cache.recv_bufs[myrank] = new double[self_len];
|
||||||
if (slength > 0)
|
cache.recv_buf_caps[myrank] = self_len;
|
||||||
|
}
|
||||||
|
data_packermix(cache.recv_bufs[myrank], cache.combined_src[myrank], cache.combined_dst[myrank], myrank, PACK, VarList1, VarList2, Symmetry);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pack and post sends.
|
||||||
|
for (int node = 0; node < cpusize; node++)
|
||||||
|
{
|
||||||
|
if (node == myrank) continue;
|
||||||
|
|
||||||
|
int slength = data_packermix(0, cache.combined_src[myrank], cache.combined_dst[myrank], node, PACK, VarList1, VarList2, Symmetry);
|
||||||
|
cache.send_lengths[node] = slength;
|
||||||
|
if (slength > 0)
|
||||||
|
{
|
||||||
|
if (slength > cache.send_buf_caps[node])
|
||||||
{
|
{
|
||||||
if (slength > cache.send_buf_caps[node])
|
if (cache.send_bufs[node]) delete[] cache.send_bufs[node];
|
||||||
{
|
cache.send_bufs[node] = new double[slength];
|
||||||
if (cache.send_bufs[node]) delete[] cache.send_bufs[node];
|
cache.send_buf_caps[node] = slength;
|
||||||
cache.send_bufs[node] = new double[slength];
|
|
||||||
cache.send_buf_caps[node] = slength;
|
|
||||||
}
|
|
||||||
data_packermix(cache.send_bufs[node], cache.combined_src[myrank], cache.combined_dst[myrank], node, PACK, VarList1, VarList2, Symmetry);
|
|
||||||
MPI_Isend((void *)cache.send_bufs[node], slength, MPI_DOUBLE, node, 1, MPI_COMM_WORLD, cache.reqs + req_no++);
|
|
||||||
}
|
}
|
||||||
int rlength = data_packermix(0, cache.combined_src[node], cache.combined_dst[node], node, UNPACK, VarList1, VarList2, Symmetry);
|
data_packermix(cache.send_bufs[node], cache.combined_src[myrank], cache.combined_dst[myrank], node, PACK, VarList1, VarList2, Symmetry);
|
||||||
cache.recv_lengths[node] = rlength;
|
MPI_Isend((void *)cache.send_bufs[node], slength, MPI_DOUBLE, node, 1, MPI_COMM_WORLD, cache.reqs + req_no);
|
||||||
if (rlength > 0)
|
req_node[req_no] = node;
|
||||||
|
req_is_recv[req_no] = 0;
|
||||||
|
req_no++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unpack as soon as receive completes to reduce pure wait time.
|
||||||
|
while (pending_recv > 0)
|
||||||
|
{
|
||||||
|
int outcount = 0;
|
||||||
|
MPI_Waitsome(req_no, cache.reqs, &outcount, completed, cache.stats);
|
||||||
|
if (outcount == MPI_UNDEFINED) break;
|
||||||
|
|
||||||
|
for (int i = 0; i < outcount; i++)
|
||||||
|
{
|
||||||
|
int idx = completed[i];
|
||||||
|
if (idx >= 0 && req_is_recv[idx])
|
||||||
{
|
{
|
||||||
if (rlength > cache.recv_buf_caps[node])
|
int recv_node_i = req_node[idx];
|
||||||
{
|
data_packermix(cache.recv_bufs[recv_node_i], cache.combined_src[recv_node_i], cache.combined_dst[recv_node_i], recv_node_i, UNPACK, VarList1, VarList2, Symmetry);
|
||||||
if (cache.recv_bufs[node]) delete[] cache.recv_bufs[node];
|
pending_recv--;
|
||||||
cache.recv_bufs[node] = new double[rlength];
|
|
||||||
cache.recv_buf_caps[node] = rlength;
|
|
||||||
}
|
|
||||||
MPI_Irecv((void *)cache.recv_bufs[node], rlength, MPI_DOUBLE, node, 1, MPI_COMM_WORLD, cache.reqs + req_no++);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MPI_Waitall(req_no, cache.reqs, cache.stats);
|
if (req_no > 0) MPI_Waitall(req_no, cache.reqs, cache.stats);
|
||||||
|
|
||||||
for (int node = 0; node < cpusize; node++)
|
if (self_len > 0)
|
||||||
if (cache.recv_bufs[node] && cache.recv_lengths[node] > 0)
|
data_packermix(cache.recv_bufs[myrank], cache.combined_src[myrank], cache.combined_dst[myrank], myrank, UNPACK, VarList1, VarList2, Symmetry);
|
||||||
data_packermix(cache.recv_bufs[node], cache.combined_src[node], cache.combined_dst[node], node, UNPACK, VarList1, VarList2, Symmetry);
|
|
||||||
|
delete[] req_node;
|
||||||
|
delete[] req_is_recv;
|
||||||
|
delete[] completed;
|
||||||
}
|
}
|
||||||
|
|
||||||
// collect all buffer grid segments or blocks for given patch
|
// collect all buffer grid segments or blocks for given patch
|
||||||
|
|||||||
@@ -108,6 +108,9 @@ namespace Parallel
|
|||||||
MPI_Status *stats;
|
MPI_Status *stats;
|
||||||
int max_reqs;
|
int max_reqs;
|
||||||
bool lengths_valid;
|
bool lengths_valid;
|
||||||
|
int *tc_req_node;
|
||||||
|
int *tc_req_is_recv;
|
||||||
|
int *tc_completed;
|
||||||
SyncCache();
|
SyncCache();
|
||||||
void invalidate();
|
void invalidate();
|
||||||
void destroy();
|
void destroy();
|
||||||
@@ -121,7 +124,10 @@ namespace Parallel
|
|||||||
struct AsyncSyncState {
|
struct AsyncSyncState {
|
||||||
int req_no;
|
int req_no;
|
||||||
bool active;
|
bool active;
|
||||||
AsyncSyncState() : req_no(0), active(false) {}
|
int *req_node;
|
||||||
|
int *req_is_recv;
|
||||||
|
int pending_recv;
|
||||||
|
AsyncSyncState() : req_no(0), active(false), req_node(0), req_is_recv(0), pending_recv(0) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
void Sync_start(MyList<Patch> *PatL, MyList<var> *VarList, int Symmetry,
|
void Sync_start(MyList<Patch> *PatL, MyList<var> *VarList, int Symmetry,
|
||||||
|
|||||||
@@ -36,12 +36,18 @@ using namespace std;
|
|||||||
#include "myglobal.h"
|
#include "myglobal.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "perf.h"
|
#include "perf.h"
|
||||||
|
|
||||||
#include "derivatives.h"
|
#include "derivatives.h"
|
||||||
#include "ricci_gamma.h"
|
#include "ricci_gamma.h"
|
||||||
|
|
||||||
//================================================================================================
|
// Compile-time switch for per-timestep memory usage collection/printing.
|
||||||
|
// Default is OFF to reduce overhead in production runs.
|
||||||
|
#ifndef BSSN_ENABLE_MEM_USAGE_LOG
|
||||||
|
#define BSSN_ENABLE_MEM_USAGE_LOG 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//================================================================================================
|
||||||
|
|
||||||
// define bssn_class
|
// define bssn_class
|
||||||
|
|
||||||
@@ -736,6 +742,8 @@ void bssn_class::Initialize()
|
|||||||
sync_cache_cor = new Parallel::SyncCache[GH->levels];
|
sync_cache_cor = new Parallel::SyncCache[GH->levels];
|
||||||
sync_cache_rp_coarse = new Parallel::SyncCache[GH->levels];
|
sync_cache_rp_coarse = new Parallel::SyncCache[GH->levels];
|
||||||
sync_cache_rp_fine = new Parallel::SyncCache[GH->levels];
|
sync_cache_rp_fine = new Parallel::SyncCache[GH->levels];
|
||||||
|
sync_cache_restrict = new Parallel::SyncCache[GH->levels];
|
||||||
|
sync_cache_outbd = new Parallel::SyncCache[GH->levels];
|
||||||
}
|
}
|
||||||
|
|
||||||
//================================================================================================
|
//================================================================================================
|
||||||
@@ -2127,8 +2135,10 @@ void bssn_class::Evolve(int Steps)
|
|||||||
#endif
|
#endif
|
||||||
*/
|
*/
|
||||||
|
|
||||||
perf bssn_perf;
|
#if BSSN_ENABLE_MEM_USAGE_LOG
|
||||||
size_t current_min, current_avg, current_max, peak_min, peak_avg, peak_max;
|
perf bssn_perf;
|
||||||
|
size_t current_min, current_avg, current_max, peak_min, peak_avg, peak_max;
|
||||||
|
#endif
|
||||||
|
|
||||||
for (int lev = 0; lev < GH->levels; lev++)
|
for (int lev = 0; lev < GH->levels; lev++)
|
||||||
GH->Lt[lev] = PhysTime;
|
GH->Lt[lev] = PhysTime;
|
||||||
@@ -2213,7 +2223,7 @@ void bssn_class::Evolve(int Steps)
|
|||||||
GH->Regrid(Symmetry, BH_num, Porgbr, Porg0,
|
GH->Regrid(Symmetry, BH_num, Porgbr, Porg0,
|
||||||
SynchList_cor, OldStateList, StateList, SynchList_pre,
|
SynchList_cor, OldStateList, StateList, SynchList_pre,
|
||||||
fgt(PhysTime - dT_mon, StartTime, dT_mon / 2), ErrorMonitor);
|
fgt(PhysTime - dT_mon, StartTime, dT_mon / 2), ErrorMonitor);
|
||||||
for (int il = 0; il < GH->levels; il++) { sync_cache_pre[il].invalidate(); sync_cache_cor[il].invalidate(); sync_cache_rp_coarse[il].invalidate(); sync_cache_rp_fine[il].invalidate(); }
|
for (int il = 0; il < GH->levels; il++) { sync_cache_pre[il].invalidate(); sync_cache_cor[il].invalidate(); sync_cache_rp_coarse[il].invalidate(); sync_cache_rp_fine[il].invalidate(); sync_cache_restrict[il].invalidate(); sync_cache_outbd[il].invalidate(); }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (REGLEV == 0 && (PSTR == 1 || PSTR == 2))
|
#if (REGLEV == 0 && (PSTR == 1 || PSTR == 2))
|
||||||
@@ -2222,21 +2232,23 @@ void bssn_class::Evolve(int Steps)
|
|||||||
// fgt(PhysTime-dT_mon,StartTime,dT_mon/2),ErrorMonitor);
|
// fgt(PhysTime-dT_mon,StartTime,dT_mon/2),ErrorMonitor);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Retrieve memory usage information used during computation; master process prints it
|
#if BSSN_ENABLE_MEM_USAGE_LOG
|
||||||
bssn_perf.MemoryUsage(¤t_min, ¤t_avg, ¤t_max,
|
// Retrieve memory usage information used during computation; master process prints it
|
||||||
&peak_min, &peak_avg, &peak_max, nprocs);
|
bssn_perf.MemoryUsage(¤t_min, ¤t_avg, ¤t_max,
|
||||||
if (myrank == 0)
|
&peak_min, &peak_avg, &peak_max, nprocs);
|
||||||
{
|
if (myrank == 0)
|
||||||
printf(" Memory usage: current %0.4lg/%0.4lg/%0.4lgMB, "
|
{
|
||||||
"peak %0.4lg/%0.4lg/%0.4lgMB\n",
|
printf(" Memory usage: current %0.4lg/%0.4lg/%0.4lgMB, "
|
||||||
(double)current_min / (1024.0 * 1024.0),
|
"peak %0.4lg/%0.4lg/%0.4lgMB\n",
|
||||||
(double)current_avg / (1024.0 * 1024.0),
|
(double)current_min / (1024.0 * 1024.0),
|
||||||
(double)current_max / (1024.0 * 1024.0),
|
(double)current_avg / (1024.0 * 1024.0),
|
||||||
(double)peak_min / (1024.0 * 1024.0),
|
(double)current_max / (1024.0 * 1024.0),
|
||||||
(double)peak_avg / (1024.0 * 1024.0),
|
(double)peak_min / (1024.0 * 1024.0),
|
||||||
(double)peak_max / (1024.0 * 1024.0));
|
(double)peak_avg / (1024.0 * 1024.0),
|
||||||
cout << endl;
|
(double)peak_max / (1024.0 * 1024.0));
|
||||||
}
|
cout << endl;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// Output puncture positions at each step
|
// Output puncture positions at each step
|
||||||
if (myrank == 0)
|
if (myrank == 0)
|
||||||
@@ -2429,7 +2441,7 @@ void bssn_class::RecursiveStep(int lev)
|
|||||||
if (GH->Regrid_Onelevel(lev, Symmetry, BH_num, Porgbr, Porg0,
|
if (GH->Regrid_Onelevel(lev, Symmetry, BH_num, Porgbr, Porg0,
|
||||||
SynchList_cor, OldStateList, StateList, SynchList_pre,
|
SynchList_cor, OldStateList, StateList, SynchList_pre,
|
||||||
fgt(PhysTime - dT_lev, StartTime, dT_lev / 2), ErrorMonitor))
|
fgt(PhysTime - dT_lev, StartTime, dT_lev / 2), ErrorMonitor))
|
||||||
for (int il = 0; il < GH->levels; il++) { sync_cache_pre[il].invalidate(); sync_cache_cor[il].invalidate(); sync_cache_rp_coarse[il].invalidate(); sync_cache_rp_fine[il].invalidate(); }
|
for (int il = 0; il < GH->levels; il++) { sync_cache_pre[il].invalidate(); sync_cache_cor[il].invalidate(); sync_cache_rp_coarse[il].invalidate(); sync_cache_rp_fine[il].invalidate(); sync_cache_restrict[il].invalidate(); sync_cache_outbd[il].invalidate(); }
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2608,7 +2620,7 @@ void bssn_class::ParallelStep()
|
|||||||
if (GH->Regrid_Onelevel(GH->mylev, Symmetry, BH_num, Porgbr, Porg0,
|
if (GH->Regrid_Onelevel(GH->mylev, Symmetry, BH_num, Porgbr, Porg0,
|
||||||
SynchList_cor, OldStateList, StateList, SynchList_pre,
|
SynchList_cor, OldStateList, StateList, SynchList_pre,
|
||||||
fgt(PhysTime - dT_lev, StartTime, dT_lev / 2), ErrorMonitor))
|
fgt(PhysTime - dT_lev, StartTime, dT_lev / 2), ErrorMonitor))
|
||||||
for (int il = 0; il < GH->levels; il++) { sync_cache_pre[il].invalidate(); sync_cache_cor[il].invalidate(); sync_cache_rp_coarse[il].invalidate(); sync_cache_rp_fine[il].invalidate(); }
|
for (int il = 0; il < GH->levels; il++) { sync_cache_pre[il].invalidate(); sync_cache_cor[il].invalidate(); sync_cache_rp_coarse[il].invalidate(); sync_cache_rp_fine[il].invalidate(); sync_cache_restrict[il].invalidate(); sync_cache_outbd[il].invalidate(); }
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2775,7 +2787,7 @@ void bssn_class::ParallelStep()
|
|||||||
if (GH->Regrid_Onelevel(lev + 1, Symmetry, BH_num, Porgbr, Porg0,
|
if (GH->Regrid_Onelevel(lev + 1, Symmetry, BH_num, Porgbr, Porg0,
|
||||||
SynchList_cor, OldStateList, StateList, SynchList_pre,
|
SynchList_cor, OldStateList, StateList, SynchList_pre,
|
||||||
fgt(PhysTime - dT_levp1, StartTime, dT_levp1 / 2), ErrorMonitor))
|
fgt(PhysTime - dT_levp1, StartTime, dT_levp1 / 2), ErrorMonitor))
|
||||||
for (int il = 0; il < GH->levels; il++) { sync_cache_pre[il].invalidate(); sync_cache_cor[il].invalidate(); sync_cache_rp_coarse[il].invalidate(); sync_cache_rp_fine[il].invalidate(); }
|
for (int il = 0; il < GH->levels; il++) { sync_cache_pre[il].invalidate(); sync_cache_cor[il].invalidate(); sync_cache_rp_coarse[il].invalidate(); sync_cache_rp_fine[il].invalidate(); sync_cache_restrict[il].invalidate(); sync_cache_outbd[il].invalidate(); }
|
||||||
|
|
||||||
// a_stream.clear();
|
// a_stream.clear();
|
||||||
// a_stream.str("");
|
// a_stream.str("");
|
||||||
@@ -2790,7 +2802,7 @@ void bssn_class::ParallelStep()
|
|||||||
if (GH->Regrid_Onelevel(lev, Symmetry, BH_num, Porgbr, Porg0,
|
if (GH->Regrid_Onelevel(lev, Symmetry, BH_num, Porgbr, Porg0,
|
||||||
SynchList_cor, OldStateList, StateList, SynchList_pre,
|
SynchList_cor, OldStateList, StateList, SynchList_pre,
|
||||||
fgt(PhysTime - dT_lev, StartTime, dT_lev / 2), ErrorMonitor))
|
fgt(PhysTime - dT_lev, StartTime, dT_lev / 2), ErrorMonitor))
|
||||||
for (int il = 0; il < GH->levels; il++) { sync_cache_pre[il].invalidate(); sync_cache_cor[il].invalidate(); sync_cache_rp_coarse[il].invalidate(); sync_cache_rp_fine[il].invalidate(); }
|
for (int il = 0; il < GH->levels; il++) { sync_cache_pre[il].invalidate(); sync_cache_cor[il].invalidate(); sync_cache_rp_coarse[il].invalidate(); sync_cache_rp_fine[il].invalidate(); sync_cache_restrict[il].invalidate(); sync_cache_outbd[il].invalidate(); }
|
||||||
|
|
||||||
// a_stream.clear();
|
// a_stream.clear();
|
||||||
// a_stream.str("");
|
// a_stream.str("");
|
||||||
@@ -2809,7 +2821,7 @@ void bssn_class::ParallelStep()
|
|||||||
if (GH->Regrid_Onelevel(lev - 1, Symmetry, BH_num, Porgbr, Porg0,
|
if (GH->Regrid_Onelevel(lev - 1, Symmetry, BH_num, Porgbr, Porg0,
|
||||||
SynchList_cor, OldStateList, StateList, SynchList_pre,
|
SynchList_cor, OldStateList, StateList, SynchList_pre,
|
||||||
fgt(PhysTime - dT_lev, StartTime, dT_levm1 / 2), ErrorMonitor))
|
fgt(PhysTime - dT_lev, StartTime, dT_levm1 / 2), ErrorMonitor))
|
||||||
for (int il = 0; il < GH->levels; il++) { sync_cache_pre[il].invalidate(); sync_cache_cor[il].invalidate(); sync_cache_rp_coarse[il].invalidate(); sync_cache_rp_fine[il].invalidate(); }
|
for (int il = 0; il < GH->levels; il++) { sync_cache_pre[il].invalidate(); sync_cache_cor[il].invalidate(); sync_cache_rp_coarse[il].invalidate(); sync_cache_rp_fine[il].invalidate(); sync_cache_restrict[il].invalidate(); sync_cache_outbd[il].invalidate(); }
|
||||||
|
|
||||||
// a_stream.clear();
|
// a_stream.clear();
|
||||||
// a_stream.str("");
|
// a_stream.str("");
|
||||||
@@ -2825,7 +2837,7 @@ void bssn_class::ParallelStep()
|
|||||||
if (GH->Regrid_Onelevel(lev - 1, Symmetry, BH_num, Porgbr, Porg0,
|
if (GH->Regrid_Onelevel(lev - 1, Symmetry, BH_num, Porgbr, Porg0,
|
||||||
SynchList_cor, OldStateList, StateList, SynchList_pre,
|
SynchList_cor, OldStateList, StateList, SynchList_pre,
|
||||||
fgt(PhysTime - dT_lev, StartTime, dT_levm1 / 2), ErrorMonitor))
|
fgt(PhysTime - dT_lev, StartTime, dT_levm1 / 2), ErrorMonitor))
|
||||||
for (int il = 0; il < GH->levels; il++) { sync_cache_pre[il].invalidate(); sync_cache_cor[il].invalidate(); sync_cache_rp_coarse[il].invalidate(); sync_cache_rp_fine[il].invalidate(); }
|
for (int il = 0; il < GH->levels; il++) { sync_cache_pre[il].invalidate(); sync_cache_cor[il].invalidate(); sync_cache_rp_coarse[il].invalidate(); sync_cache_rp_fine[il].invalidate(); sync_cache_restrict[il].invalidate(); sync_cache_outbd[il].invalidate(); }
|
||||||
|
|
||||||
// a_stream.clear();
|
// a_stream.clear();
|
||||||
// a_stream.str("");
|
// a_stream.str("");
|
||||||
@@ -5796,7 +5808,7 @@ void bssn_class::RestrictProlong(int lev, int YN, bool BB,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (RPB == 0)
|
#if (RPB == 0)
|
||||||
Parallel::Restrict(GH->PatL[lev - 1], GH->PatL[lev], SL, SynchList_pre, Symmetry);
|
Parallel::Restrict_cached(GH->PatL[lev - 1], GH->PatL[lev], SL, SynchList_pre, Symmetry, sync_cache_restrict[lev]);
|
||||||
#elif (RPB == 1)
|
#elif (RPB == 1)
|
||||||
// Parallel::Restrict_bam(GH->PatL[lev-1],GH->PatL[lev],SL,SynchList_pre,Symmetry);
|
// Parallel::Restrict_bam(GH->PatL[lev-1],GH->PatL[lev],SL,SynchList_pre,Symmetry);
|
||||||
Parallel::Restrict_bam(GH->PatL[lev - 1], GH->PatL[lev], SL, SynchList_pre, GH->rsul[lev], Symmetry);
|
Parallel::Restrict_bam(GH->PatL[lev - 1], GH->PatL[lev], SL, SynchList_pre, GH->rsul[lev], Symmetry);
|
||||||
@@ -5820,7 +5832,7 @@ void bssn_class::RestrictProlong(int lev, int YN, bool BB,
|
|||||||
|
|
||||||
#if (RPB == 0)
|
#if (RPB == 0)
|
||||||
#if (MIXOUTB == 0)
|
#if (MIXOUTB == 0)
|
||||||
Parallel::OutBdLow2Hi(GH->PatL[lev - 1], GH->PatL[lev], SynchList_pre, SL, Symmetry);
|
Parallel::OutBdLow2Hi_cached(GH->PatL[lev - 1], GH->PatL[lev], SynchList_pre, SL, Symmetry, sync_cache_outbd[lev]);
|
||||||
#elif (MIXOUTB == 1)
|
#elif (MIXOUTB == 1)
|
||||||
Parallel::OutBdLow2Himix(GH->PatL[lev - 1], GH->PatL[lev], SynchList_pre, SL, Symmetry);
|
Parallel::OutBdLow2Himix(GH->PatL[lev - 1], GH->PatL[lev], SynchList_pre, SL, Symmetry);
|
||||||
#endif
|
#endif
|
||||||
@@ -5847,7 +5859,7 @@ void bssn_class::RestrictProlong(int lev, int YN, bool BB,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (RPB == 0)
|
#if (RPB == 0)
|
||||||
Parallel::Restrict(GH->PatL[lev - 1], GH->PatL[lev], SL, SL, Symmetry);
|
Parallel::Restrict_cached(GH->PatL[lev - 1], GH->PatL[lev], SL, SL, Symmetry, sync_cache_restrict[lev]);
|
||||||
#elif (RPB == 1)
|
#elif (RPB == 1)
|
||||||
// Parallel::Restrict_bam(GH->PatL[lev-1],GH->PatL[lev],SL,SL,Symmetry);
|
// Parallel::Restrict_bam(GH->PatL[lev-1],GH->PatL[lev],SL,SL,Symmetry);
|
||||||
Parallel::Restrict_bam(GH->PatL[lev - 1], GH->PatL[lev], SL, SL, GH->rsul[lev], Symmetry);
|
Parallel::Restrict_bam(GH->PatL[lev - 1], GH->PatL[lev], SL, SL, GH->rsul[lev], Symmetry);
|
||||||
@@ -5871,7 +5883,7 @@ void bssn_class::RestrictProlong(int lev, int YN, bool BB,
|
|||||||
|
|
||||||
#if (RPB == 0)
|
#if (RPB == 0)
|
||||||
#if (MIXOUTB == 0)
|
#if (MIXOUTB == 0)
|
||||||
Parallel::OutBdLow2Hi(GH->PatL[lev - 1], GH->PatL[lev], SL, SL, Symmetry);
|
Parallel::OutBdLow2Hi_cached(GH->PatL[lev - 1], GH->PatL[lev], SL, SL, Symmetry, sync_cache_outbd[lev]);
|
||||||
#elif (MIXOUTB == 1)
|
#elif (MIXOUTB == 1)
|
||||||
Parallel::OutBdLow2Himix(GH->PatL[lev - 1], GH->PatL[lev], SL, SL, Symmetry);
|
Parallel::OutBdLow2Himix(GH->PatL[lev - 1], GH->PatL[lev], SL, SL, Symmetry);
|
||||||
#endif
|
#endif
|
||||||
@@ -5940,7 +5952,7 @@ void bssn_class::RestrictProlong_aux(int lev, int YN, bool BB,
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if (RPB == 0)
|
#if (RPB == 0)
|
||||||
Parallel::Restrict(GH->PatL[lev - 1], GH->PatL[lev], SL, SynchList_pre, Symmetry);
|
Parallel::Restrict_cached(GH->PatL[lev - 1], GH->PatL[lev], SL, SynchList_pre, Symmetry, sync_cache_restrict[lev]);
|
||||||
#elif (RPB == 1)
|
#elif (RPB == 1)
|
||||||
// Parallel::Restrict_bam(GH->PatL[lev-1],GH->PatL[lev],SL,SynchList_pre,Symmetry);
|
// Parallel::Restrict_bam(GH->PatL[lev-1],GH->PatL[lev],SL,SynchList_pre,Symmetry);
|
||||||
Parallel::Restrict_bam(GH->PatL[lev - 1], GH->PatL[lev], SL, SynchList_pre, GH->rsul[lev], Symmetry);
|
Parallel::Restrict_bam(GH->PatL[lev - 1], GH->PatL[lev], SL, SynchList_pre, GH->rsul[lev], Symmetry);
|
||||||
@@ -5950,7 +5962,7 @@ void bssn_class::RestrictProlong_aux(int lev, int YN, bool BB,
|
|||||||
|
|
||||||
#if (RPB == 0)
|
#if (RPB == 0)
|
||||||
#if (MIXOUTB == 0)
|
#if (MIXOUTB == 0)
|
||||||
Parallel::OutBdLow2Hi(GH->PatL[lev - 1], GH->PatL[lev], SynchList_pre, SL, Symmetry);
|
Parallel::OutBdLow2Hi_cached(GH->PatL[lev - 1], GH->PatL[lev], SynchList_pre, SL, Symmetry, sync_cache_outbd[lev]);
|
||||||
#elif (MIXOUTB == 1)
|
#elif (MIXOUTB == 1)
|
||||||
Parallel::OutBdLow2Himix(GH->PatL[lev - 1], GH->PatL[lev], SynchList_pre, SL, Symmetry);
|
Parallel::OutBdLow2Himix(GH->PatL[lev - 1], GH->PatL[lev], SynchList_pre, SL, Symmetry);
|
||||||
#endif
|
#endif
|
||||||
@@ -5962,7 +5974,7 @@ void bssn_class::RestrictProlong_aux(int lev, int YN, bool BB,
|
|||||||
else // no time refinement levels and for all same time levels
|
else // no time refinement levels and for all same time levels
|
||||||
{
|
{
|
||||||
#if (RPB == 0)
|
#if (RPB == 0)
|
||||||
Parallel::Restrict(GH->PatL[lev - 1], GH->PatL[lev], SL, SL, Symmetry);
|
Parallel::Restrict_cached(GH->PatL[lev - 1], GH->PatL[lev], SL, SL, Symmetry, sync_cache_restrict[lev]);
|
||||||
#elif (RPB == 1)
|
#elif (RPB == 1)
|
||||||
// Parallel::Restrict_bam(GH->PatL[lev-1],GH->PatL[lev],SL,SL,Symmetry);
|
// Parallel::Restrict_bam(GH->PatL[lev-1],GH->PatL[lev],SL,SL,Symmetry);
|
||||||
Parallel::Restrict_bam(GH->PatL[lev - 1], GH->PatL[lev], SL, SL, GH->rsul[lev], Symmetry);
|
Parallel::Restrict_bam(GH->PatL[lev - 1], GH->PatL[lev], SL, SL, GH->rsul[lev], Symmetry);
|
||||||
@@ -5972,7 +5984,7 @@ void bssn_class::RestrictProlong_aux(int lev, int YN, bool BB,
|
|||||||
|
|
||||||
#if (RPB == 0)
|
#if (RPB == 0)
|
||||||
#if (MIXOUTB == 0)
|
#if (MIXOUTB == 0)
|
||||||
Parallel::OutBdLow2Hi(GH->PatL[lev - 1], GH->PatL[lev], SL, SL, Symmetry);
|
Parallel::OutBdLow2Hi_cached(GH->PatL[lev - 1], GH->PatL[lev], SL, SL, Symmetry, sync_cache_outbd[lev]);
|
||||||
#elif (MIXOUTB == 1)
|
#elif (MIXOUTB == 1)
|
||||||
Parallel::OutBdLow2Himix(GH->PatL[lev - 1], GH->PatL[lev], SL, SL, Symmetry);
|
Parallel::OutBdLow2Himix(GH->PatL[lev - 1], GH->PatL[lev], SL, SL, Symmetry);
|
||||||
#endif
|
#endif
|
||||||
@@ -6027,7 +6039,7 @@ void bssn_class::RestrictProlong(int lev, int YN, bool BB)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if (RPB == 0)
|
#if (RPB == 0)
|
||||||
Parallel::Restrict(GH->PatL[lev - 1], GH->PatL[lev], SynchList_cor, SynchList_pre, Symmetry);
|
Parallel::Restrict_cached(GH->PatL[lev - 1], GH->PatL[lev], SynchList_cor, SynchList_pre, Symmetry, sync_cache_restrict[lev]);
|
||||||
#elif (RPB == 1)
|
#elif (RPB == 1)
|
||||||
// Parallel::Restrict_bam(GH->PatL[lev-1],GH->PatL[lev],SynchList_cor,SynchList_pre,Symmetry);
|
// Parallel::Restrict_bam(GH->PatL[lev-1],GH->PatL[lev],SynchList_cor,SynchList_pre,Symmetry);
|
||||||
Parallel::Restrict_bam(GH->PatL[lev - 1], GH->PatL[lev], SynchList_cor, SynchList_pre, GH->rsul[lev], Symmetry);
|
Parallel::Restrict_bam(GH->PatL[lev - 1], GH->PatL[lev], SynchList_cor, SynchList_pre, GH->rsul[lev], Symmetry);
|
||||||
@@ -6037,7 +6049,7 @@ void bssn_class::RestrictProlong(int lev, int YN, bool BB)
|
|||||||
|
|
||||||
#if (RPB == 0)
|
#if (RPB == 0)
|
||||||
#if (MIXOUTB == 0)
|
#if (MIXOUTB == 0)
|
||||||
Parallel::OutBdLow2Hi(GH->PatL[lev - 1], GH->PatL[lev], SynchList_pre, SynchList_cor, Symmetry);
|
Parallel::OutBdLow2Hi_cached(GH->PatL[lev - 1], GH->PatL[lev], SynchList_pre, SynchList_cor, Symmetry, sync_cache_outbd[lev]);
|
||||||
#elif (MIXOUTB == 1)
|
#elif (MIXOUTB == 1)
|
||||||
Parallel::OutBdLow2Himix(GH->PatL[lev - 1], GH->PatL[lev], SynchList_pre, SynchList_cor, Symmetry);
|
Parallel::OutBdLow2Himix(GH->PatL[lev - 1], GH->PatL[lev], SynchList_pre, SynchList_cor, Symmetry);
|
||||||
#endif
|
#endif
|
||||||
@@ -6051,7 +6063,7 @@ void bssn_class::RestrictProlong(int lev, int YN, bool BB)
|
|||||||
if (myrank == 0)
|
if (myrank == 0)
|
||||||
cout << "===: " << GH->Lt[lev - 1] << "," << GH->Lt[lev] + dT_lev << endl;
|
cout << "===: " << GH->Lt[lev - 1] << "," << GH->Lt[lev] + dT_lev << endl;
|
||||||
#if (RPB == 0)
|
#if (RPB == 0)
|
||||||
Parallel::Restrict(GH->PatL[lev - 1], GH->PatL[lev], SynchList_cor, StateList, Symmetry);
|
Parallel::Restrict_cached(GH->PatL[lev - 1], GH->PatL[lev], SynchList_cor, StateList, Symmetry, sync_cache_restrict[lev]);
|
||||||
#elif (RPB == 1)
|
#elif (RPB == 1)
|
||||||
// Parallel::Restrict_bam(GH->PatL[lev-1],GH->PatL[lev],SynchList_cor,StateList,Symmetry);
|
// Parallel::Restrict_bam(GH->PatL[lev-1],GH->PatL[lev],SynchList_cor,StateList,Symmetry);
|
||||||
Parallel::Restrict_bam(GH->PatL[lev - 1], GH->PatL[lev], SynchList_cor, StateList, GH->rsul[lev], Symmetry);
|
Parallel::Restrict_bam(GH->PatL[lev - 1], GH->PatL[lev], SynchList_cor, StateList, GH->rsul[lev], Symmetry);
|
||||||
@@ -6061,7 +6073,7 @@ void bssn_class::RestrictProlong(int lev, int YN, bool BB)
|
|||||||
|
|
||||||
#if (RPB == 0)
|
#if (RPB == 0)
|
||||||
#if (MIXOUTB == 0)
|
#if (MIXOUTB == 0)
|
||||||
Parallel::OutBdLow2Hi(GH->PatL[lev - 1], GH->PatL[lev], StateList, SynchList_cor, Symmetry);
|
Parallel::OutBdLow2Hi_cached(GH->PatL[lev - 1], GH->PatL[lev], StateList, SynchList_cor, Symmetry, sync_cache_outbd[lev]);
|
||||||
#elif (MIXOUTB == 1)
|
#elif (MIXOUTB == 1)
|
||||||
Parallel::OutBdLow2Himix(GH->PatL[lev - 1], GH->PatL[lev], StateList, SynchList_cor, Symmetry);
|
Parallel::OutBdLow2Himix(GH->PatL[lev - 1], GH->PatL[lev], StateList, SynchList_cor, Symmetry);
|
||||||
#endif
|
#endif
|
||||||
@@ -6102,7 +6114,7 @@ void bssn_class::ProlongRestrict(int lev, int YN, bool BB)
|
|||||||
|
|
||||||
#if (RPB == 0)
|
#if (RPB == 0)
|
||||||
#if (MIXOUTB == 0)
|
#if (MIXOUTB == 0)
|
||||||
Parallel::OutBdLow2Hi(GH->PatL[lev - 1], GH->PatL[lev], SynchList_pre, SynchList_cor, Symmetry);
|
Parallel::OutBdLow2Hi_cached(GH->PatL[lev - 1], GH->PatL[lev], SynchList_pre, SynchList_cor, Symmetry, sync_cache_outbd[lev]);
|
||||||
#elif (MIXOUTB == 1)
|
#elif (MIXOUTB == 1)
|
||||||
Parallel::OutBdLow2Himix(GH->PatL[lev - 1], GH->PatL[lev], SynchList_pre, SynchList_cor, Symmetry);
|
Parallel::OutBdLow2Himix(GH->PatL[lev - 1], GH->PatL[lev], SynchList_pre, SynchList_cor, Symmetry);
|
||||||
#endif
|
#endif
|
||||||
@@ -6115,7 +6127,7 @@ void bssn_class::ProlongRestrict(int lev, int YN, bool BB)
|
|||||||
{
|
{
|
||||||
#if (RPB == 0)
|
#if (RPB == 0)
|
||||||
#if (MIXOUTB == 0)
|
#if (MIXOUTB == 0)
|
||||||
Parallel::OutBdLow2Hi(GH->PatL[lev - 1], GH->PatL[lev], StateList, SynchList_cor, Symmetry);
|
Parallel::OutBdLow2Hi_cached(GH->PatL[lev - 1], GH->PatL[lev], StateList, SynchList_cor, Symmetry, sync_cache_outbd[lev]);
|
||||||
#elif (MIXOUTB == 1)
|
#elif (MIXOUTB == 1)
|
||||||
Parallel::OutBdLow2Himix(GH->PatL[lev - 1], GH->PatL[lev], StateList, SynchList_cor, Symmetry);
|
Parallel::OutBdLow2Himix(GH->PatL[lev - 1], GH->PatL[lev], StateList, SynchList_cor, Symmetry);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -130,6 +130,8 @@ public:
|
|||||||
Parallel::SyncCache *sync_cache_cor; // per-level cache for corrector sync
|
Parallel::SyncCache *sync_cache_cor; // per-level cache for corrector sync
|
||||||
Parallel::SyncCache *sync_cache_rp_coarse; // RestrictProlong sync on PatL[lev-1]
|
Parallel::SyncCache *sync_cache_rp_coarse; // RestrictProlong sync on PatL[lev-1]
|
||||||
Parallel::SyncCache *sync_cache_rp_fine; // RestrictProlong sync on PatL[lev]
|
Parallel::SyncCache *sync_cache_rp_fine; // RestrictProlong sync on PatL[lev]
|
||||||
|
Parallel::SyncCache *sync_cache_restrict; // cached Restrict in RestrictProlong
|
||||||
|
Parallel::SyncCache *sync_cache_outbd; // cached OutBdLow2Hi in RestrictProlong
|
||||||
|
|
||||||
monitor *ErrorMonitor, *Psi4Monitor, *BHMonitor, *MAPMonitor;
|
monitor *ErrorMonitor, *Psi4Monitor, *BHMonitor, *MAPMonitor;
|
||||||
monitor *ConVMonitor;
|
monitor *ConVMonitor;
|
||||||
|
|||||||
@@ -59,9 +59,10 @@
|
|||||||
real*8, dimension(ex(1),ex(2),ex(3)),intent(out) :: Rxx,Rxy,Rxz,Ryy,Ryz,Rzz
|
real*8, dimension(ex(1),ex(2),ex(3)),intent(out) :: Rxx,Rxy,Rxz,Ryy,Ryz,Rzz
|
||||||
real*8,intent(in) :: eps
|
real*8,intent(in) :: eps
|
||||||
real*8, dimension(ex(1),ex(2),ex(3)),intent(inout) :: ham_Res, movx_Res, movy_Res, movz_Res
|
real*8, dimension(ex(1),ex(2),ex(3)),intent(inout) :: ham_Res, movx_Res, movy_Res, movz_Res
|
||||||
real*8, dimension(ex(1),ex(2),ex(3)),intent(inout) :: Gmx_Res, Gmy_Res, Gmz_Res
|
real*8, dimension(ex(1),ex(2),ex(3)),intent(inout) :: Gmx_Res, Gmy_Res, Gmz_Res
|
||||||
! gont = 0: success; gont = 1: something wrong
|
! gont = 0: success; gont = 1: something wrong
|
||||||
integer::gont
|
integer::gont
|
||||||
|
integer :: i,j,k
|
||||||
|
|
||||||
!~~~~~~> Other variables:
|
!~~~~~~> Other variables:
|
||||||
|
|
||||||
@@ -83,11 +84,18 @@
|
|||||||
real*8, dimension(ex(1),ex(2),ex(3)) :: gupxx,gupxy,gupxz
|
real*8, dimension(ex(1),ex(2),ex(3)) :: gupxx,gupxy,gupxz
|
||||||
real*8, dimension(ex(1),ex(2),ex(3)) :: gupyy,gupyz,gupzz
|
real*8, dimension(ex(1),ex(2),ex(3)) :: gupyy,gupyz,gupzz
|
||||||
|
|
||||||
real*8,dimension(3) ::SSS,AAS,ASA,SAA,ASS,SAS,SSA
|
real*8,dimension(3) ::SSS,AAS,ASA,SAA,ASS,SAS,SSA
|
||||||
real*8 :: dX, dY, dZ, PI
|
real*8 :: dX, dY, dZ, PI
|
||||||
real*8, parameter :: ZEO = 0.d0,ONE = 1.D0, TWO = 2.D0, FOUR = 4.D0
|
real*8 :: divb_loc,det_loc
|
||||||
real*8, parameter :: EIGHT = 8.D0, HALF = 0.5D0, THR = 3.d0
|
real*8 :: gupxx_loc,gupxy_loc,gupxz_loc,gupyy_loc,gupyz_loc,gupzz_loc
|
||||||
real*8, parameter :: SYM = 1.D0, ANTI= - 1.D0
|
real*8 :: Rxx_loc,Rxy_loc,Rxz_loc,Ryy_loc,Ryz_loc,Rzz_loc
|
||||||
|
real*8 :: fxx_loc,fxy_loc,fxz_loc
|
||||||
|
real*8 :: Gamxa_loc,Gamya_loc,Gamza_loc
|
||||||
|
real*8 :: f_loc,chin_loc
|
||||||
|
real*8 :: l_fxx,l_fxy,l_fxz,l_fyy,l_fyz,l_fzz,S_loc
|
||||||
|
real*8, parameter :: ZEO = 0.d0,ONE = 1.D0, TWO = 2.D0, FOUR = 4.D0
|
||||||
|
real*8, parameter :: EIGHT = 8.D0, HALF = 0.5D0, THR = 3.d0
|
||||||
|
real*8, parameter :: SYM = 1.D0, ANTI= - 1.D0
|
||||||
double precision,parameter::FF = 0.75d0,eta=2.d0
|
double precision,parameter::FF = 0.75d0,eta=2.d0
|
||||||
real*8, parameter :: F1o3 = 1.D0/3.D0, F2o3 = 2.D0/3.D0,F3o2=1.5d0, F1o6 = 1.D0/6.D0
|
real*8, parameter :: F1o3 = 1.D0/3.D0, F2o3 = 2.D0/3.D0,F3o2=1.5d0, F1o6 = 1.D0/6.D0
|
||||||
real*8, parameter :: F16=1.6d1,F8=8.d0
|
real*8, parameter :: F16=1.6d1,F8=8.d0
|
||||||
@@ -96,11 +104,11 @@
|
|||||||
real*8, dimension(ex(1),ex(2),ex(3)) :: reta
|
real*8, dimension(ex(1),ex(2),ex(3)) :: reta
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (GAUGE == 6 || GAUGE == 7)
|
#if (GAUGE == 6 || GAUGE == 7)
|
||||||
integer :: BHN,i,j,k
|
integer :: BHN
|
||||||
real*8, dimension(9) :: Porg
|
real*8, dimension(9) :: Porg
|
||||||
real*8, dimension(3) :: Mass
|
real*8, dimension(3) :: Mass
|
||||||
real*8 :: r1,r2,M,A,w1,w2,C1,C2
|
real*8 :: r1,r2,M,A,w1,w2,C1,C2
|
||||||
real*8, dimension(ex(1),ex(2),ex(3)) :: reta
|
real*8, dimension(ex(1),ex(2),ex(3)) :: reta
|
||||||
|
|
||||||
call getpbh(BHN,Porg,Mass)
|
call getpbh(BHN,Porg,Mass)
|
||||||
@@ -145,174 +153,204 @@
|
|||||||
dY = Y(2) - Y(1)
|
dY = Y(2) - Y(1)
|
||||||
dZ = Z(2) - Z(1)
|
dZ = Z(2) - Z(1)
|
||||||
|
|
||||||
alpn1 = Lap + ONE
|
do k=1,ex(3)
|
||||||
chin1 = chi + ONE
|
do j=1,ex(2)
|
||||||
gxx = dxx + ONE
|
do i=1,ex(1)
|
||||||
gyy = dyy + ONE
|
alpn1(i,j,k) = Lap(i,j,k) + ONE
|
||||||
gzz = dzz + ONE
|
chin1(i,j,k) = chi(i,j,k) + ONE
|
||||||
|
gxx(i,j,k) = dxx(i,j,k) + ONE
|
||||||
|
gyy(i,j,k) = dyy(i,j,k) + ONE
|
||||||
|
gzz(i,j,k) = dzz(i,j,k) + ONE
|
||||||
|
enddo
|
||||||
|
enddo
|
||||||
|
enddo
|
||||||
|
|
||||||
call fderivs(ex,betax,betaxx,betaxy,betaxz,X,Y,Z,ANTI, SYM, SYM,Symmetry,Lev)
|
call fderivs(ex,betax,betaxx,betaxy,betaxz,X,Y,Z,ANTI, SYM, SYM,Symmetry,Lev)
|
||||||
call fderivs(ex,betay,betayx,betayy,betayz,X,Y,Z, SYM,ANTI, SYM,Symmetry,Lev)
|
call fderivs(ex,betay,betayx,betayy,betayz,X,Y,Z, SYM,ANTI, SYM,Symmetry,Lev)
|
||||||
call fderivs(ex,betaz,betazx,betazy,betazz,X,Y,Z, SYM, SYM,ANTI,Symmetry,Lev)
|
call fderivs(ex,betaz,betazx,betazy,betazz,X,Y,Z, SYM, SYM,ANTI,Symmetry,Lev)
|
||||||
|
|
||||||
div_beta = betaxx + betayy + betazz
|
call fderivs(ex,chi,chix,chiy,chiz,X,Y,Z,SYM,SYM,SYM,symmetry,Lev)
|
||||||
|
|
||||||
call fderivs(ex,chi,chix,chiy,chiz,X,Y,Z,SYM,SYM,SYM,symmetry,Lev)
|
|
||||||
|
|
||||||
chi_rhs = F2o3 *chin1*( alpn1 * trK - div_beta ) !rhs for chi
|
call fderivs(ex,dxx,gxxx,gxxy,gxxz,X,Y,Z,SYM ,SYM ,SYM ,Symmetry,Lev)
|
||||||
|
call fderivs(ex,gxy,gxyx,gxyy,gxyz,X,Y,Z,ANTI,ANTI,SYM ,Symmetry,Lev)
|
||||||
call fderivs(ex,dxx,gxxx,gxxy,gxxz,X,Y,Z,SYM ,SYM ,SYM ,Symmetry,Lev)
|
call fderivs(ex,gxz,gxzx,gxzy,gxzz,X,Y,Z,ANTI,SYM ,ANTI,Symmetry,Lev)
|
||||||
call fderivs(ex,gxy,gxyx,gxyy,gxyz,X,Y,Z,ANTI,ANTI,SYM ,Symmetry,Lev)
|
call fderivs(ex,dyy,gyyx,gyyy,gyyz,X,Y,Z,SYM ,SYM ,SYM ,Symmetry,Lev)
|
||||||
call fderivs(ex,gxz,gxzx,gxzy,gxzz,X,Y,Z,ANTI,SYM ,ANTI,Symmetry,Lev)
|
call fderivs(ex,gyz,gyzx,gyzy,gyzz,X,Y,Z,SYM ,ANTI,ANTI,Symmetry,Lev)
|
||||||
call fderivs(ex,dyy,gyyx,gyyy,gyyz,X,Y,Z,SYM ,SYM ,SYM ,Symmetry,Lev)
|
call fderivs(ex,dzz,gzzx,gzzy,gzzz,X,Y,Z,SYM ,SYM ,SYM ,Symmetry,Lev)
|
||||||
call fderivs(ex,gyz,gyzx,gyzy,gyzz,X,Y,Z,SYM ,ANTI,ANTI,Symmetry,Lev)
|
|
||||||
call fderivs(ex,dzz,gzzx,gzzy,gzzz,X,Y,Z,SYM ,SYM ,SYM ,Symmetry,Lev)
|
do k=1,ex(3)
|
||||||
|
do j=1,ex(2)
|
||||||
gxx_rhs = - TWO * alpn1 * Axx - F2o3 * gxx * div_beta + &
|
do i=1,ex(1)
|
||||||
TWO *( gxx * betaxx + gxy * betayx + gxz * betazx)
|
divb_loc = betaxx(i,j,k) + betayy(i,j,k) + betazz(i,j,k)
|
||||||
|
div_beta(i,j,k) = divb_loc
|
||||||
gyy_rhs = - TWO * alpn1 * Ayy - F2o3 * gyy * div_beta + &
|
|
||||||
TWO *( gxy * betaxy + gyy * betayy + gyz * betazy)
|
chi_rhs(i,j,k) = F2o3 * chin1(i,j,k) * (alpn1(i,j,k) * trK(i,j,k) - divb_loc)
|
||||||
|
|
||||||
gzz_rhs = - TWO * alpn1 * Azz - F2o3 * gzz * div_beta + &
|
gxx_rhs(i,j,k) = - TWO * alpn1(i,j,k) * Axx(i,j,k) - F2o3 * gxx(i,j,k) * divb_loc + &
|
||||||
TWO *( gxz * betaxz + gyz * betayz + gzz * betazz)
|
TWO * ( gxx(i,j,k) * betaxx(i,j,k) + gxy(i,j,k) * betayx(i,j,k) + gxz(i,j,k) * betazx(i,j,k) )
|
||||||
|
|
||||||
gxy_rhs = - TWO * alpn1 * Axy + F1o3 * gxy * div_beta + &
|
gyy_rhs(i,j,k) = - TWO * alpn1(i,j,k) * Ayy(i,j,k) - F2o3 * gyy(i,j,k) * divb_loc + &
|
||||||
gxx * betaxy + gxz * betazy + &
|
TWO * ( gxy(i,j,k) * betaxy(i,j,k) + gyy(i,j,k) * betayy(i,j,k) + gyz(i,j,k) * betazy(i,j,k) )
|
||||||
gyy * betayx + gyz * betazx &
|
|
||||||
- gxy * betazz
|
gzz_rhs(i,j,k) = - TWO * alpn1(i,j,k) * Azz(i,j,k) - F2o3 * gzz(i,j,k) * divb_loc + &
|
||||||
|
TWO * ( gxz(i,j,k) * betaxz(i,j,k) + gyz(i,j,k) * betayz(i,j,k) + gzz(i,j,k) * betazz(i,j,k) )
|
||||||
gyz_rhs = - TWO * alpn1 * Ayz + F1o3 * gyz * div_beta + &
|
|
||||||
gxy * betaxz + gyy * betayz + &
|
gxy_rhs(i,j,k) = - TWO * alpn1(i,j,k) * Axy(i,j,k) + F1o3 * gxy(i,j,k) * divb_loc + &
|
||||||
gxz * betaxy + gzz * betazy &
|
gxx(i,j,k) * betaxy(i,j,k) + gxz(i,j,k) * betazy(i,j,k) + gyy(i,j,k) * betayx(i,j,k) + &
|
||||||
- gyz * betaxx
|
gyz(i,j,k) * betazx(i,j,k) - gxy(i,j,k) * betazz(i,j,k)
|
||||||
|
|
||||||
gxz_rhs = - TWO * alpn1 * Axz + F1o3 * gxz * div_beta + &
|
gyz_rhs(i,j,k) = - TWO * alpn1(i,j,k) * Ayz(i,j,k) + F1o3 * gyz(i,j,k) * divb_loc + &
|
||||||
gxx * betaxz + gxy * betayz + &
|
gxy(i,j,k) * betaxz(i,j,k) + gyy(i,j,k) * betayz(i,j,k) + gxz(i,j,k) * betaxy(i,j,k) + &
|
||||||
gyz * betayx + gzz * betazx &
|
gzz(i,j,k) * betazy(i,j,k) - gyz(i,j,k) * betaxx(i,j,k)
|
||||||
- gxz * betayy !rhs for gij
|
|
||||||
|
gxz_rhs(i,j,k) = - TWO * alpn1(i,j,k) * Axz(i,j,k) + F1o3 * gxz(i,j,k) * divb_loc + &
|
||||||
! invert tilted metric
|
gxx(i,j,k) * betaxz(i,j,k) + gxy(i,j,k) * betayz(i,j,k) + gyz(i,j,k) * betayx(i,j,k) + &
|
||||||
gupzz = gxx * gyy * gzz + gxy * gyz * gxz + gxz * gxy * gyz - &
|
gzz(i,j,k) * betazx(i,j,k) - gxz(i,j,k) * betayy(i,j,k)
|
||||||
gxz * gyy * gxz - gxy * gxy * gzz - gxx * gyz * gyz
|
|
||||||
gupxx = ( gyy * gzz - gyz * gyz ) / gupzz
|
det_loc = gxx(i,j,k) * gyy(i,j,k) * gzz(i,j,k) + gxy(i,j,k) * gyz(i,j,k) * gxz(i,j,k) + &
|
||||||
gupxy = - ( gxy * gzz - gyz * gxz ) / gupzz
|
gxz(i,j,k) * gxy(i,j,k) * gyz(i,j,k) - gxz(i,j,k) * gyy(i,j,k) * gxz(i,j,k) - &
|
||||||
gupxz = ( gxy * gyz - gyy * gxz ) / gupzz
|
gxy(i,j,k) * gxy(i,j,k) * gzz(i,j,k) - gxx(i,j,k) * gyz(i,j,k) * gyz(i,j,k)
|
||||||
gupyy = ( gxx * gzz - gxz * gxz ) / gupzz
|
gupxx_loc = ( gyy(i,j,k) * gzz(i,j,k) - gyz(i,j,k) * gyz(i,j,k) ) / det_loc
|
||||||
gupyz = - ( gxx * gyz - gxy * gxz ) / gupzz
|
gupxy_loc = - ( gxy(i,j,k) * gzz(i,j,k) - gyz(i,j,k) * gxz(i,j,k) ) / det_loc
|
||||||
gupzz = ( gxx * gyy - gxy * gxy ) / gupzz
|
gupxz_loc = ( gxy(i,j,k) * gyz(i,j,k) - gyy(i,j,k) * gxz(i,j,k) ) / det_loc
|
||||||
|
gupyy_loc = ( gxx(i,j,k) * gzz(i,j,k) - gxz(i,j,k) * gxz(i,j,k) ) / det_loc
|
||||||
if(co == 0)then
|
gupyz_loc = - ( gxx(i,j,k) * gyz(i,j,k) - gxy(i,j,k) * gxz(i,j,k) ) / det_loc
|
||||||
! Gam^i_Res = Gam^i + gup^ij_,j
|
gupzz_loc = ( gxx(i,j,k) * gyy(i,j,k) - gxy(i,j,k) * gxy(i,j,k) ) / det_loc
|
||||||
Gmx_Res = Gamx - (gupxx*(gupxx*gxxx+gupxy*gxyx+gupxz*gxzx)&
|
gupxx(i,j,k) = gupxx_loc
|
||||||
+gupxy*(gupxx*gxyx+gupxy*gyyx+gupxz*gyzx)&
|
gupxy(i,j,k) = gupxy_loc
|
||||||
+gupxz*(gupxx*gxzx+gupxy*gyzx+gupxz*gzzx)&
|
gupxz(i,j,k) = gupxz_loc
|
||||||
+gupxx*(gupxy*gxxy+gupyy*gxyy+gupyz*gxzy)&
|
gupyy(i,j,k) = gupyy_loc
|
||||||
+gupxy*(gupxy*gxyy+gupyy*gyyy+gupyz*gyzy)&
|
gupyz(i,j,k) = gupyz_loc
|
||||||
+gupxz*(gupxy*gxzy+gupyy*gyzy+gupyz*gzzy)&
|
gupzz(i,j,k) = gupzz_loc
|
||||||
+gupxx*(gupxz*gxxz+gupyz*gxyz+gupzz*gxzz)&
|
|
||||||
+gupxy*(gupxz*gxyz+gupyz*gyyz+gupzz*gyzz)&
|
if(co == 0)then
|
||||||
+gupxz*(gupxz*gxzz+gupyz*gyzz+gupzz*gzzz))
|
Gmx_Res(i,j,k) = Gamx(i,j,k) - ( &
|
||||||
Gmy_Res = Gamy - (gupxx*(gupxy*gxxx+gupyy*gxyx+gupyz*gxzx)&
|
gupxx_loc*(gupxx_loc*gxxx(i,j,k)+gupxy_loc*gxyx(i,j,k)+gupxz_loc*gxzx(i,j,k)) + &
|
||||||
+gupxy*(gupxy*gxyx+gupyy*gyyx+gupyz*gyzx)&
|
gupxy_loc*(gupxx_loc*gxyx(i,j,k)+gupxy_loc*gyyx(i,j,k)+gupxz_loc*gyzx(i,j,k)) + &
|
||||||
+gupxz*(gupxy*gxzx+gupyy*gyzx+gupyz*gzzx)&
|
gupxz_loc*(gupxx_loc*gxzx(i,j,k)+gupxy_loc*gyzx(i,j,k)+gupxz_loc*gzzx(i,j,k)) + &
|
||||||
+gupxy*(gupxy*gxxy+gupyy*gxyy+gupyz*gxzy)&
|
gupxx_loc*(gupxy_loc*gxxy(i,j,k)+gupyy_loc*gxyy(i,j,k)+gupyz_loc*gxzy(i,j,k)) + &
|
||||||
+gupyy*(gupxy*gxyy+gupyy*gyyy+gupyz*gyzy)&
|
gupxy_loc*(gupxy_loc*gxyy(i,j,k)+gupyy_loc*gyyy(i,j,k)+gupyz_loc*gyzy(i,j,k)) + &
|
||||||
+gupyz*(gupxy*gxzy+gupyy*gyzy+gupyz*gzzy)&
|
gupxz_loc*(gupxy_loc*gxzy(i,j,k)+gupyy_loc*gyzy(i,j,k)+gupyz_loc*gzzy(i,j,k)) + &
|
||||||
+gupxy*(gupxz*gxxz+gupyz*gxyz+gupzz*gxzz)&
|
gupxx_loc*(gupxz_loc*gxxz(i,j,k)+gupyz_loc*gxyz(i,j,k)+gupzz_loc*gxzz(i,j,k)) + &
|
||||||
+gupyy*(gupxz*gxyz+gupyz*gyyz+gupzz*gyzz)&
|
gupxy_loc*(gupxz_loc*gxyz(i,j,k)+gupyz_loc*gyyz(i,j,k)+gupzz_loc*gyzz(i,j,k)) + &
|
||||||
+gupyz*(gupxz*gxzz+gupyz*gyzz+gupzz*gzzz))
|
gupxz_loc*(gupxz_loc*gxzz(i,j,k)+gupyz_loc*gyzz(i,j,k)+gupzz_loc*gzzz(i,j,k)))
|
||||||
Gmz_Res = Gamz - (gupxx*(gupxz*gxxx+gupyz*gxyx+gupzz*gxzx)&
|
Gmy_Res(i,j,k) = Gamy(i,j,k) - ( &
|
||||||
+gupxy*(gupxz*gxyx+gupyz*gyyx+gupzz*gyzx)&
|
gupxx_loc*(gupxy_loc*gxxx(i,j,k)+gupyy_loc*gxyx(i,j,k)+gupyz_loc*gxzx(i,j,k)) + &
|
||||||
+gupxz*(gupxz*gxzx+gupyz*gyzx+gupzz*gzzx)&
|
gupxy_loc*(gupxy_loc*gxyx(i,j,k)+gupyy_loc*gyyx(i,j,k)+gupyz_loc*gyzx(i,j,k)) + &
|
||||||
+gupxy*(gupxz*gxxy+gupyz*gxyy+gupzz*gxzy)&
|
gupxz_loc*(gupxy_loc*gxzx(i,j,k)+gupyy_loc*gyzx(i,j,k)+gupyz_loc*gzzx(i,j,k)) + &
|
||||||
+gupyy*(gupxz*gxyy+gupyz*gyyy+gupzz*gyzy)&
|
gupxy_loc*(gupxy_loc*gxxy(i,j,k)+gupyy_loc*gxyy(i,j,k)+gupyz_loc*gxzy(i,j,k)) + &
|
||||||
+gupyz*(gupxz*gxzy+gupyz*gyzy+gupzz*gzzy)&
|
gupyy_loc*(gupxy_loc*gxyy(i,j,k)+gupyy_loc*gyyy(i,j,k)+gupyz_loc*gyzy(i,j,k)) + &
|
||||||
+gupxz*(gupxz*gxxz+gupyz*gxyz+gupzz*gxzz)&
|
gupyz_loc*(gupxy_loc*gxzy(i,j,k)+gupyy_loc*gyzy(i,j,k)+gupyz_loc*gzzy(i,j,k)) + &
|
||||||
+gupyz*(gupxz*gxyz+gupyz*gyyz+gupzz*gyzz)&
|
gupxy_loc*(gupxz_loc*gxxz(i,j,k)+gupyz_loc*gxyz(i,j,k)+gupzz_loc*gxzz(i,j,k)) + &
|
||||||
+gupzz*(gupxz*gxzz+gupyz*gyzz+gupzz*gzzz))
|
gupyy_loc*(gupxz_loc*gxyz(i,j,k)+gupyz_loc*gyyz(i,j,k)+gupzz_loc*gyzz(i,j,k)) + &
|
||||||
endif
|
gupyz_loc*(gupxz_loc*gxzz(i,j,k)+gupyz_loc*gyzz(i,j,k)+gupzz_loc*gzzz(i,j,k)))
|
||||||
|
Gmz_Res(i,j,k) = Gamz(i,j,k) - ( &
|
||||||
! second kind of connection
|
gupxx_loc*(gupxz_loc*gxxx(i,j,k)+gupyz_loc*gxyx(i,j,k)+gupzz_loc*gxzx(i,j,k)) + &
|
||||||
Gamxxx =HALF*( gupxx*gxxx + gupxy*(TWO*gxyx - gxxy ) + gupxz*(TWO*gxzx - gxxz ))
|
gupxy_loc*(gupxz_loc*gxyx(i,j,k)+gupyz_loc*gyyx(i,j,k)+gupzz_loc*gyzx(i,j,k)) + &
|
||||||
Gamyxx =HALF*( gupxy*gxxx + gupyy*(TWO*gxyx - gxxy ) + gupyz*(TWO*gxzx - gxxz ))
|
gupxz_loc*(gupxz_loc*gxzx(i,j,k)+gupyz_loc*gyzx(i,j,k)+gupzz_loc*gzzx(i,j,k)) + &
|
||||||
Gamzxx =HALF*( gupxz*gxxx + gupyz*(TWO*gxyx - gxxy ) + gupzz*(TWO*gxzx - gxxz ))
|
gupxy_loc*(gupxz_loc*gxxy(i,j,k)+gupyz_loc*gxyy(i,j,k)+gupzz_loc*gxzy(i,j,k)) + &
|
||||||
|
gupyy_loc*(gupxz_loc*gxyy(i,j,k)+gupyz_loc*gyyy(i,j,k)+gupzz_loc*gyzy(i,j,k)) + &
|
||||||
Gamxyy =HALF*( gupxx*(TWO*gxyy - gyyx ) + gupxy*gyyy + gupxz*(TWO*gyzy - gyyz ))
|
gupyz_loc*(gupxz_loc*gxzy(i,j,k)+gupyz_loc*gyzy(i,j,k)+gupzz_loc*gzzy(i,j,k)) + &
|
||||||
Gamyyy =HALF*( gupxy*(TWO*gxyy - gyyx ) + gupyy*gyyy + gupyz*(TWO*gyzy - gyyz ))
|
gupxz_loc*(gupxz_loc*gxxz(i,j,k)+gupyz_loc*gxyz(i,j,k)+gupzz_loc*gxzz(i,j,k)) + &
|
||||||
Gamzyy =HALF*( gupxz*(TWO*gxyy - gyyx ) + gupyz*gyyy + gupzz*(TWO*gyzy - gyyz ))
|
gupyz_loc*(gupxz_loc*gxyz(i,j,k)+gupyz_loc*gyyz(i,j,k)+gupzz_loc*gyzz(i,j,k)) + &
|
||||||
|
gupzz_loc*(gupxz_loc*gxzz(i,j,k)+gupyz_loc*gyzz(i,j,k)+gupzz_loc*gzzz(i,j,k)))
|
||||||
Gamxzz =HALF*( gupxx*(TWO*gxzz - gzzx ) + gupxy*(TWO*gyzz - gzzy ) + gupxz*gzzz)
|
endif
|
||||||
Gamyzz =HALF*( gupxy*(TWO*gxzz - gzzx ) + gupyy*(TWO*gyzz - gzzy ) + gupyz*gzzz)
|
|
||||||
Gamzzz =HALF*( gupxz*(TWO*gxzz - gzzx ) + gupyz*(TWO*gyzz - gzzy ) + gupzz*gzzz)
|
Gamxxx(i,j,k)=HALF*( gupxx_loc*gxxx(i,j,k) + gupxy_loc*(TWO*gxyx(i,j,k) - gxxy(i,j,k)) + gupxz_loc*(TWO*gxzx(i,j,k) - gxxz(i,j,k)))
|
||||||
|
Gamyxx(i,j,k)=HALF*( gupxy_loc*gxxx(i,j,k) + gupyy_loc*(TWO*gxyx(i,j,k) - gxxy(i,j,k)) + gupyz_loc*(TWO*gxzx(i,j,k) - gxxz(i,j,k)))
|
||||||
Gamxxy =HALF*( gupxx*gxxy + gupxy*gyyx + gupxz*( gxzy + gyzx - gxyz ) )
|
Gamzxx(i,j,k)=HALF*( gupxz_loc*gxxx(i,j,k) + gupyz_loc*(TWO*gxyx(i,j,k) - gxxy(i,j,k)) + gupzz_loc*(TWO*gxzx(i,j,k) - gxxz(i,j,k)))
|
||||||
Gamyxy =HALF*( gupxy*gxxy + gupyy*gyyx + gupyz*( gxzy + gyzx - gxyz ) )
|
|
||||||
Gamzxy =HALF*( gupxz*gxxy + gupyz*gyyx + gupzz*( gxzy + gyzx - gxyz ) )
|
Gamxyy(i,j,k)=HALF*( gupxx_loc*(TWO*gxyy(i,j,k) - gyyx(i,j,k)) + gupxy_loc*gyyy(i,j,k) + gupxz_loc*(TWO*gyzy(i,j,k) - gyyz(i,j,k)))
|
||||||
|
Gamyyy(i,j,k)=HALF*( gupxy_loc*(TWO*gxyy(i,j,k) - gyyx(i,j,k)) + gupyy_loc*gyyy(i,j,k) + gupyz_loc*(TWO*gyzy(i,j,k) - gyyz(i,j,k)))
|
||||||
Gamxxz =HALF*( gupxx*gxxz + gupxy*( gxyz + gyzx - gxzy ) + gupxz*gzzx )
|
Gamzyy(i,j,k)=HALF*( gupxz_loc*(TWO*gxyy(i,j,k) - gyyx(i,j,k)) + gupyz_loc*gyyy(i,j,k) + gupzz_loc*(TWO*gyzy(i,j,k) - gyyz(i,j,k)))
|
||||||
Gamyxz =HALF*( gupxy*gxxz + gupyy*( gxyz + gyzx - gxzy ) + gupyz*gzzx )
|
|
||||||
Gamzxz =HALF*( gupxz*gxxz + gupyz*( gxyz + gyzx - gxzy ) + gupzz*gzzx )
|
Gamxzz(i,j,k)=HALF*( gupxx_loc*(TWO*gxzz(i,j,k) - gzzx(i,j,k)) + gupxy_loc*(TWO*gyzz(i,j,k) - gzzy(i,j,k)) + gupxz_loc*gzzz(i,j,k))
|
||||||
|
Gamyzz(i,j,k)=HALF*( gupxy_loc*(TWO*gxzz(i,j,k) - gzzx(i,j,k)) + gupyy_loc*(TWO*gyzz(i,j,k) - gzzy(i,j,k)) + gupyz_loc*gzzz(i,j,k))
|
||||||
Gamxyz =HALF*( gupxx*( gxyz + gxzy - gyzx ) + gupxy*gyyz + gupxz*gzzy )
|
Gamzzz(i,j,k)=HALF*( gupxz_loc*(TWO*gxzz(i,j,k) - gzzx(i,j,k)) + gupyz_loc*(TWO*gyzz(i,j,k) - gzzy(i,j,k)) + gupzz_loc*gzzz(i,j,k))
|
||||||
Gamyyz =HALF*( gupxy*( gxyz + gxzy - gyzx ) + gupyy*gyyz + gupyz*gzzy )
|
|
||||||
Gamzyz =HALF*( gupxz*( gxyz + gxzy - gyzx ) + gupyz*gyyz + gupzz*gzzy )
|
Gamxxy(i,j,k)=HALF*( gupxx_loc*gxxy(i,j,k) + gupxy_loc*gyyx(i,j,k) + gupxz_loc*(gxzy(i,j,k) + gyzx(i,j,k) - gxyz(i,j,k)) )
|
||||||
! Raise indices of \tilde A_{ij} and store in R_ij
|
Gamyxy(i,j,k)=HALF*( gupxy_loc*gxxy(i,j,k) + gupyy_loc*gyyx(i,j,k) + gupyz_loc*(gxzy(i,j,k) + gyzx(i,j,k) - gxyz(i,j,k)) )
|
||||||
|
Gamzxy(i,j,k)=HALF*( gupxz_loc*gxxy(i,j,k) + gupyz_loc*gyyx(i,j,k) + gupzz_loc*(gxzy(i,j,k) + gyzx(i,j,k) - gxyz(i,j,k)) )
|
||||||
Rxx = gupxx * gupxx * Axx + gupxy * gupxy * Ayy + gupxz * gupxz * Azz + &
|
|
||||||
TWO*(gupxx * gupxy * Axy + gupxx * gupxz * Axz + gupxy * gupxz * Ayz)
|
Gamxxz(i,j,k)=HALF*( gupxx_loc*gxxz(i,j,k) + gupxy_loc*(gxyz(i,j,k) + gyzx(i,j,k) - gxzy(i,j,k)) + gupxz_loc*gzzx(i,j,k) )
|
||||||
|
Gamyxz(i,j,k)=HALF*( gupxy_loc*gxxz(i,j,k) + gupyy_loc*(gxyz(i,j,k) + gyzx(i,j,k) - gxzy(i,j,k)) + gupyz_loc*gzzx(i,j,k) )
|
||||||
Ryy = gupxy * gupxy * Axx + gupyy * gupyy * Ayy + gupyz * gupyz * Azz + &
|
Gamzxz(i,j,k)=HALF*( gupxz_loc*gxxz(i,j,k) + gupyz_loc*(gxyz(i,j,k) + gyzx(i,j,k) - gxzy(i,j,k)) + gupzz_loc*gzzx(i,j,k) )
|
||||||
TWO*(gupxy * gupyy * Axy + gupxy * gupyz * Axz + gupyy * gupyz * Ayz)
|
|
||||||
|
Gamxyz(i,j,k)=HALF*( gupxx_loc*(gxyz(i,j,k) + gxzy(i,j,k) - gyzx(i,j,k)) + gupxy_loc*gyyz(i,j,k) + gupxz_loc*gzzy(i,j,k) )
|
||||||
Rzz = gupxz * gupxz * Axx + gupyz * gupyz * Ayy + gupzz * gupzz * Azz + &
|
Gamyyz(i,j,k)=HALF*( gupxy_loc*(gxyz(i,j,k) + gxzy(i,j,k) - gyzx(i,j,k)) + gupyy_loc*gyyz(i,j,k) + gupyz_loc*gzzy(i,j,k) )
|
||||||
TWO*(gupxz * gupyz * Axy + gupxz * gupzz * Axz + gupyz * gupzz * Ayz)
|
Gamzyz(i,j,k)=HALF*( gupxz_loc*(gxyz(i,j,k) + gxzy(i,j,k) - gyzx(i,j,k)) + gupyz_loc*gyyz(i,j,k) + gupzz_loc*gzzy(i,j,k) )
|
||||||
|
enddo
|
||||||
Rxy = gupxx * gupxy * Axx + gupxy * gupyy * Ayy + gupxz * gupyz * Azz + &
|
enddo
|
||||||
(gupxx * gupyy + gupxy * gupxy)* Axy + &
|
enddo
|
||||||
(gupxx * gupyz + gupxz * gupxy)* Axz + &
|
! Raise indices of \tilde A_{ij} and store in R_ij
|
||||||
(gupxy * gupyz + gupxz * gupyy)* Ayz
|
|
||||||
|
! Right hand side for Gam^i without shift terms...
|
||||||
Rxz = gupxx * gupxz * Axx + gupxy * gupyz * Ayy + gupxz * gupzz * Azz + &
|
call fderivs(ex,Lap,Lapx,Lapy,Lapz,X,Y,Z,SYM,SYM,SYM,Symmetry,Lev)
|
||||||
(gupxx * gupyz + gupxy * gupxz)* Axy + &
|
call fderivs(ex,trK,Kx,Ky,Kz,X,Y,Z,SYM,SYM,SYM,symmetry,Lev)
|
||||||
(gupxx * gupzz + gupxz * gupxz)* Axz + &
|
do k=1,ex(3)
|
||||||
(gupxy * gupzz + gupxz * gupyz)* Ayz
|
do j=1,ex(2)
|
||||||
|
do i=1,ex(1)
|
||||||
Ryz = gupxy * gupxz * Axx + gupyy * gupyz * Ayy + gupyz * gupzz * Azz + &
|
gupxx_loc = gupxx(i,j,k)
|
||||||
(gupxy * gupyz + gupyy * gupxz)* Axy + &
|
gupxy_loc = gupxy(i,j,k)
|
||||||
(gupxy * gupzz + gupyz * gupxz)* Axz + &
|
gupxz_loc = gupxz(i,j,k)
|
||||||
(gupyy * gupzz + gupyz * gupyz)* Ayz
|
gupyy_loc = gupyy(i,j,k)
|
||||||
|
gupyz_loc = gupyz(i,j,k)
|
||||||
! Right hand side for Gam^i without shift terms...
|
gupzz_loc = gupzz(i,j,k)
|
||||||
call fderivs(ex,Lap,Lapx,Lapy,Lapz,X,Y,Z,SYM,SYM,SYM,Symmetry,Lev)
|
|
||||||
call fderivs(ex,trK,Kx,Ky,Kz,X,Y,Z,SYM,SYM,SYM,symmetry,Lev)
|
Rxx_loc = gupxx_loc * gupxx_loc * Axx(i,j,k) + gupxy_loc * gupxy_loc * Ayy(i,j,k) + gupxz_loc * gupxz_loc * Azz(i,j,k) + &
|
||||||
|
TWO * (gupxx_loc * gupxy_loc * Axy(i,j,k) + gupxx_loc * gupxz_loc * Axz(i,j,k) + gupxy_loc * gupxz_loc * Ayz(i,j,k))
|
||||||
Gamx_rhs = - TWO * ( Lapx * Rxx + Lapy * Rxy + Lapz * Rxz ) + &
|
Ryy_loc = gupxy_loc * gupxy_loc * Axx(i,j,k) + gupyy_loc * gupyy_loc * Ayy(i,j,k) + gupyz_loc * gupyz_loc * Azz(i,j,k) + &
|
||||||
TWO * alpn1 * ( &
|
TWO * (gupxy_loc * gupyy_loc * Axy(i,j,k) + gupxy_loc * gupyz_loc * Axz(i,j,k) + gupyy_loc * gupyz_loc * Ayz(i,j,k))
|
||||||
-F3o2/chin1 * ( chix * Rxx + chiy * Rxy + chiz * Rxz ) - &
|
Rzz_loc = gupxz_loc * gupxz_loc * Axx(i,j,k) + gupyz_loc * gupyz_loc * Ayy(i,j,k) + gupzz_loc * gupzz_loc * Azz(i,j,k) + &
|
||||||
gupxx * ( F2o3 * Kx + EIGHT * PI * Sx ) - &
|
TWO * (gupxz_loc * gupyz_loc * Axy(i,j,k) + gupxz_loc * gupzz_loc * Axz(i,j,k) + gupyz_loc * gupzz_loc * Ayz(i,j,k))
|
||||||
gupxy * ( F2o3 * Ky + EIGHT * PI * Sy ) - &
|
Rxy_loc = gupxx_loc * gupxy_loc * Axx(i,j,k) + gupxy_loc * gupyy_loc * Ayy(i,j,k) + gupxz_loc * gupyz_loc * Azz(i,j,k) + &
|
||||||
gupxz * ( F2o3 * Kz + EIGHT * PI * Sz ) + &
|
(gupxx_loc * gupyy_loc + gupxy_loc * gupxy_loc) * Axy(i,j,k) + &
|
||||||
Gamxxx * Rxx + Gamxyy * Ryy + Gamxzz * Rzz + &
|
(gupxx_loc * gupyz_loc + gupxz_loc * gupxy_loc) * Axz(i,j,k) + &
|
||||||
TWO * ( Gamxxy * Rxy + Gamxxz * Rxz + Gamxyz * Ryz ) )
|
(gupxy_loc * gupyz_loc + gupxz_loc * gupyy_loc) * Ayz(i,j,k)
|
||||||
|
Rxz_loc = gupxx_loc * gupxz_loc * Axx(i,j,k) + gupxy_loc * gupyz_loc * Ayy(i,j,k) + gupxz_loc * gupzz_loc * Azz(i,j,k) + &
|
||||||
Gamy_rhs = - TWO * ( Lapx * Rxy + Lapy * Ryy + Lapz * Ryz ) + &
|
(gupxx_loc * gupyz_loc + gupxy_loc * gupxz_loc) * Axy(i,j,k) + &
|
||||||
TWO * alpn1 * ( &
|
(gupxx_loc * gupzz_loc + gupxz_loc * gupxz_loc) * Axz(i,j,k) + &
|
||||||
-F3o2/chin1 * ( chix * Rxy + chiy * Ryy + chiz * Ryz ) - &
|
(gupxy_loc * gupzz_loc + gupxz_loc * gupyz_loc) * Ayz(i,j,k)
|
||||||
gupxy * ( F2o3 * Kx + EIGHT * PI * Sx ) - &
|
Ryz_loc = gupxy_loc * gupxz_loc * Axx(i,j,k) + gupyy_loc * gupyz_loc * Ayy(i,j,k) + gupyz_loc * gupzz_loc * Azz(i,j,k) + &
|
||||||
gupyy * ( F2o3 * Ky + EIGHT * PI * Sy ) - &
|
(gupxy_loc * gupyz_loc + gupyy_loc * gupxz_loc) * Axy(i,j,k) + &
|
||||||
gupyz * ( F2o3 * Kz + EIGHT * PI * Sz ) + &
|
(gupxy_loc * gupzz_loc + gupyz_loc * gupxz_loc) * Axz(i,j,k) + &
|
||||||
Gamyxx * Rxx + Gamyyy * Ryy + Gamyzz * Rzz + &
|
(gupyy_loc * gupzz_loc + gupyz_loc * gupyz_loc) * Ayz(i,j,k)
|
||||||
TWO * ( Gamyxy * Rxy + Gamyxz * Rxz + Gamyyz * Ryz ) )
|
Rxx(i,j,k) = Rxx_loc
|
||||||
|
Ryy(i,j,k) = Ryy_loc
|
||||||
Gamz_rhs = - TWO * ( Lapx * Rxz + Lapy * Ryz + Lapz * Rzz ) + &
|
Rzz(i,j,k) = Rzz_loc
|
||||||
TWO * alpn1 * ( &
|
Rxy(i,j,k) = Rxy_loc
|
||||||
-F3o2/chin1 * ( chix * Rxz + chiy * Ryz + chiz * Rzz ) - &
|
Rxz(i,j,k) = Rxz_loc
|
||||||
gupxz * ( F2o3 * Kx + EIGHT * PI * Sx ) - &
|
Ryz(i,j,k) = Ryz_loc
|
||||||
gupyz * ( F2o3 * Ky + EIGHT * PI * Sy ) - &
|
|
||||||
gupzz * ( F2o3 * Kz + EIGHT * PI * Sz ) + &
|
Gamx_rhs(i,j,k) = - TWO * (Lapx(i,j,k) * Rxx_loc + Lapy(i,j,k) * Rxy_loc + Lapz(i,j,k) * Rxz_loc) + &
|
||||||
Gamzxx * Rxx + Gamzyy * Ryy + Gamzzz * Rzz + &
|
TWO * alpn1(i,j,k) * ( &
|
||||||
TWO * ( Gamzxy * Rxy + Gamzxz * Rxz + Gamzyz * Ryz ) )
|
-F3o2/chin1(i,j,k) * (chix(i,j,k) * Rxx_loc + chiy(i,j,k) * Rxy_loc + chiz(i,j,k) * Rxz_loc) - &
|
||||||
|
gupxx_loc * (F2o3 * Kx(i,j,k) + EIGHT * PI * Sx(i,j,k)) - &
|
||||||
|
gupxy_loc * (F2o3 * Ky(i,j,k) + EIGHT * PI * Sy(i,j,k)) - &
|
||||||
|
gupxz_loc * (F2o3 * Kz(i,j,k) + EIGHT * PI * Sz(i,j,k)) + &
|
||||||
|
Gamxxx(i,j,k) * Rxx_loc + Gamxyy(i,j,k) * Ryy_loc + Gamxzz(i,j,k) * Rzz_loc + &
|
||||||
|
TWO * (Gamxxy(i,j,k) * Rxy_loc + Gamxxz(i,j,k) * Rxz_loc + Gamxyz(i,j,k) * Ryz_loc))
|
||||||
|
|
||||||
|
Gamy_rhs(i,j,k) = - TWO * (Lapx(i,j,k) * Rxy_loc + Lapy(i,j,k) * Ryy_loc + Lapz(i,j,k) * Ryz_loc) + &
|
||||||
|
TWO * alpn1(i,j,k) * ( &
|
||||||
|
-F3o2/chin1(i,j,k) * (chix(i,j,k) * Rxy_loc + chiy(i,j,k) * Ryy_loc + chiz(i,j,k) * Ryz_loc) - &
|
||||||
|
gupxy_loc * (F2o3 * Kx(i,j,k) + EIGHT * PI * Sx(i,j,k)) - &
|
||||||
|
gupyy_loc * (F2o3 * Ky(i,j,k) + EIGHT * PI * Sy(i,j,k)) - &
|
||||||
|
gupyz_loc * (F2o3 * Kz(i,j,k) + EIGHT * PI * Sz(i,j,k)) + &
|
||||||
|
Gamyxx(i,j,k) * Rxx_loc + Gamyyy(i,j,k) * Ryy_loc + Gamyzz(i,j,k) * Rzz_loc + &
|
||||||
|
TWO * (Gamyxy(i,j,k) * Rxy_loc + Gamyxz(i,j,k) * Rxz_loc + Gamyyz(i,j,k) * Ryz_loc))
|
||||||
|
|
||||||
|
Gamz_rhs(i,j,k) = - TWO * (Lapx(i,j,k) * Rxz_loc + Lapy(i,j,k) * Ryz_loc + Lapz(i,j,k) * Rzz_loc) + &
|
||||||
|
TWO * alpn1(i,j,k) * ( &
|
||||||
|
-F3o2/chin1(i,j,k) * (chix(i,j,k) * Rxz_loc + chiy(i,j,k) * Ryz_loc + chiz(i,j,k) * Rzz_loc) - &
|
||||||
|
gupxz_loc * (F2o3 * Kx(i,j,k) + EIGHT * PI * Sx(i,j,k)) - &
|
||||||
|
gupyz_loc * (F2o3 * Ky(i,j,k) + EIGHT * PI * Sy(i,j,k)) - &
|
||||||
|
gupzz_loc * (F2o3 * Kz(i,j,k) + EIGHT * PI * Sz(i,j,k)) + &
|
||||||
|
Gamzxx(i,j,k) * Rxx_loc + Gamzyy(i,j,k) * Ryy_loc + Gamzzz(i,j,k) * Rzz_loc + &
|
||||||
|
TWO * (Gamzxy(i,j,k) * Rxy_loc + Gamzxz(i,j,k) * Rxz_loc + Gamzyz(i,j,k) * Ryz_loc))
|
||||||
|
enddo
|
||||||
|
enddo
|
||||||
|
enddo
|
||||||
|
|
||||||
call fdderivs(ex,betax,gxxx,gxyx,gxzx,gyyx,gyzx,gzzx,&
|
call fdderivs(ex,betax,gxxx,gxyx,gxzx,gyyx,gyzx,gzzx,&
|
||||||
X,Y,Z,ANTI,SYM, SYM ,Symmetry,Lev)
|
X,Y,Z,ANTI,SYM, SYM ,Symmetry,Lev)
|
||||||
@@ -321,38 +359,54 @@
|
|||||||
call fdderivs(ex,betaz,gxxz,gxyz,gxzz,gyyz,gyzz,gzzz,&
|
call fdderivs(ex,betaz,gxxz,gxyz,gxzz,gyyz,gyzz,gzzz,&
|
||||||
X,Y,Z,SYM ,SYM, ANTI,Symmetry,Lev)
|
X,Y,Z,SYM ,SYM, ANTI,Symmetry,Lev)
|
||||||
|
|
||||||
fxx = gxxx + gxyy + gxzz
|
call fderivs(ex,Gamx,Gamxx,Gamxy,Gamxz,X,Y,Z,ANTI,SYM ,SYM ,Symmetry,Lev)
|
||||||
fxy = gxyx + gyyy + gyzz
|
call fderivs(ex,Gamy,Gamyx,Gamyy,Gamyz,X,Y,Z,SYM ,ANTI,SYM ,Symmetry,Lev)
|
||||||
fxz = gxzx + gyzy + gzzz
|
call fderivs(ex,Gamz,Gamzx,Gamzy,Gamzz,X,Y,Z,SYM ,SYM ,ANTI,Symmetry,Lev)
|
||||||
|
do k=1,ex(3)
|
||||||
Gamxa = gupxx * Gamxxx + gupyy * Gamxyy + gupzz * Gamxzz + &
|
do j=1,ex(2)
|
||||||
TWO*( gupxy * Gamxxy + gupxz * Gamxxz + gupyz * Gamxyz )
|
do i=1,ex(1)
|
||||||
Gamya = gupxx * Gamyxx + gupyy * Gamyyy + gupzz * Gamyzz + &
|
divb_loc = div_beta(i,j,k)
|
||||||
TWO*( gupxy * Gamyxy + gupxz * Gamyxz + gupyz * Gamyyz )
|
fxx_loc = gxxx(i,j,k) + gxyy(i,j,k) + gxzz(i,j,k)
|
||||||
Gamza = gupxx * Gamzxx + gupyy * Gamzyy + gupzz * Gamzzz + &
|
fxy_loc = gxyx(i,j,k) + gyyy(i,j,k) + gyzz(i,j,k)
|
||||||
TWO*( gupxy * Gamzxy + gupxz * Gamzxz + gupyz * Gamzyz )
|
fxz_loc = gxzx(i,j,k) + gyzy(i,j,k) + gzzz(i,j,k)
|
||||||
|
|
||||||
call fderivs(ex,Gamx,Gamxx,Gamxy,Gamxz,X,Y,Z,ANTI,SYM ,SYM ,Symmetry,Lev)
|
gupxx_loc = gupxx(i,j,k)
|
||||||
call fderivs(ex,Gamy,Gamyx,Gamyy,Gamyz,X,Y,Z,SYM ,ANTI,SYM ,Symmetry,Lev)
|
gupxy_loc = gupxy(i,j,k)
|
||||||
call fderivs(ex,Gamz,Gamzx,Gamzy,Gamzz,X,Y,Z,SYM ,SYM ,ANTI,Symmetry,Lev)
|
gupxz_loc = gupxz(i,j,k)
|
||||||
|
gupyy_loc = gupyy(i,j,k)
|
||||||
Gamx_rhs = Gamx_rhs + F2o3 * Gamxa * div_beta - &
|
gupyz_loc = gupyz(i,j,k)
|
||||||
Gamxa * betaxx - Gamya * betaxy - Gamza * betaxz + &
|
gupzz_loc = gupzz(i,j,k)
|
||||||
F1o3 * (gupxx * fxx + gupxy * fxy + gupxz * fxz ) + &
|
|
||||||
gupxx * gxxx + gupyy * gyyx + gupzz * gzzx + &
|
Gamxa_loc = gupxx_loc * Gamxxx(i,j,k) + gupyy_loc * Gamxyy(i,j,k) + gupzz_loc * Gamxzz(i,j,k) + &
|
||||||
TWO * (gupxy * gxyx + gupxz * gxzx + gupyz * gyzx )
|
TWO * (gupxy_loc * Gamxxy(i,j,k) + gupxz_loc * Gamxxz(i,j,k) + gupyz_loc * Gamxyz(i,j,k))
|
||||||
|
Gamya_loc = gupxx_loc * Gamyxx(i,j,k) + gupyy_loc * Gamyyy(i,j,k) + gupzz_loc * Gamyzz(i,j,k) + &
|
||||||
Gamy_rhs = Gamy_rhs + F2o3 * Gamya * div_beta - &
|
TWO * (gupxy_loc * Gamyxy(i,j,k) + gupxz_loc * Gamyxz(i,j,k) + gupyz_loc * Gamyyz(i,j,k))
|
||||||
Gamxa * betayx - Gamya * betayy - Gamza * betayz + &
|
Gamza_loc = gupxx_loc * Gamzxx(i,j,k) + gupyy_loc * Gamzyy(i,j,k) + gupzz_loc * Gamzzz(i,j,k) + &
|
||||||
F1o3 * (gupxy * fxx + gupyy * fxy + gupyz * fxz ) + &
|
TWO * (gupxy_loc * Gamzxy(i,j,k) + gupxz_loc * Gamzxz(i,j,k) + gupyz_loc * Gamzyz(i,j,k))
|
||||||
gupxx * gxxy + gupyy * gyyy + gupzz * gzzy + &
|
Gamxa(i,j,k) = Gamxa_loc
|
||||||
TWO * (gupxy * gxyy + gupxz * gxzy + gupyz * gyzy )
|
Gamya(i,j,k) = Gamya_loc
|
||||||
|
Gamza(i,j,k) = Gamza_loc
|
||||||
Gamz_rhs = Gamz_rhs + F2o3 * Gamza * div_beta - &
|
|
||||||
Gamxa * betazx - Gamya * betazy - Gamza * betazz + &
|
Gamx_rhs(i,j,k) = Gamx_rhs(i,j,k) + F2o3 * Gamxa_loc * divb_loc - &
|
||||||
F1o3 * (gupxz * fxx + gupyz * fxy + gupzz * fxz ) + &
|
Gamxa_loc * betaxx(i,j,k) - Gamya_loc * betaxy(i,j,k) - Gamza_loc * betaxz(i,j,k) + &
|
||||||
gupxx * gxxz + gupyy * gyyz + gupzz * gzzz + &
|
F1o3 * (gupxx_loc * fxx_loc + gupxy_loc * fxy_loc + gupxz_loc * fxz_loc) + &
|
||||||
TWO * (gupxy * gxyz + gupxz * gxzz + gupyz * gyzz ) !rhs for Gam^i
|
gupxx_loc * gxxx(i,j,k) + gupyy_loc * gyyx(i,j,k) + gupzz_loc * gzzx(i,j,k) + &
|
||||||
|
TWO * (gupxy_loc * gxyx(i,j,k) + gupxz_loc * gxzx(i,j,k) + gupyz_loc * gyzx(i,j,k))
|
||||||
|
|
||||||
|
Gamy_rhs(i,j,k) = Gamy_rhs(i,j,k) + F2o3 * Gamya_loc * divb_loc - &
|
||||||
|
Gamxa_loc * betayx(i,j,k) - Gamya_loc * betayy(i,j,k) - Gamza_loc * betayz(i,j,k) + &
|
||||||
|
F1o3 * (gupxy_loc * fxx_loc + gupyy_loc * fxy_loc + gupyz_loc * fxz_loc) + &
|
||||||
|
gupxx_loc * gxxy(i,j,k) + gupyy_loc * gyyy(i,j,k) + gupzz_loc * gzzy(i,j,k) + &
|
||||||
|
TWO * (gupxy_loc * gxyy(i,j,k) + gupxz_loc * gxzy(i,j,k) + gupyz_loc * gyzy(i,j,k))
|
||||||
|
|
||||||
|
Gamz_rhs(i,j,k) = Gamz_rhs(i,j,k) + F2o3 * Gamza_loc * divb_loc - &
|
||||||
|
Gamxa_loc * betazx(i,j,k) - Gamya_loc * betazy(i,j,k) - Gamza_loc * betazz(i,j,k) + &
|
||||||
|
F1o3 * (gupxz_loc * fxx_loc + gupyz_loc * fxy_loc + gupzz_loc * fxz_loc) + &
|
||||||
|
gupxx_loc * gxxz(i,j,k) + gupyy_loc * gyyz(i,j,k) + gupzz_loc * gzzz(i,j,k) + &
|
||||||
|
TWO * (gupxy_loc * gxyz(i,j,k) + gupxz_loc * gxzz(i,j,k) + gupyz_loc * gyzz(i,j,k))
|
||||||
|
enddo
|
||||||
|
enddo
|
||||||
|
enddo
|
||||||
|
|
||||||
!first kind of connection stored in gij,k
|
!first kind of connection stored in gij,k
|
||||||
gxxx = gxx * Gamxxx + gxy * Gamyxx + gxz * Gamzxx
|
gxxx = gxx * Gamxxx + gxy * Gamyxx + gxz * Gamzxx
|
||||||
@@ -601,192 +655,190 @@
|
|||||||
Gamxyz * gxzz + Gamyyz * gyzz + Gamzyz * gzzz + &
|
Gamxyz * gxzz + Gamyyz * gyzz + Gamzyz * gzzz + &
|
||||||
Gamxzz * gxzy + Gamyzz * gyzy + Gamzzz * gzzy + &
|
Gamxzz * gxzy + Gamyzz * gyzy + Gamzzz * gzzy + &
|
||||||
Gamxyz * gzzx + Gamyyz * gzzy + Gamzyz * gzzz )
|
Gamxyz * gzzx + Gamyyz * gzzy + Gamzyz * gzzz )
|
||||||
!covariant second derivative of chi respect to tilted metric
|
!covariant second derivative of chi respect to tilted metric
|
||||||
call fdderivs(ex,chi,fxx,fxy,fxz,fyy,fyz,fzz,X,Y,Z,SYM,SYM,SYM,Symmetry,Lev)
|
call fdderivs(ex,chi,fxx,fxy,fxz,fyy,fyz,fzz,X,Y,Z,SYM,SYM,SYM,Symmetry,Lev)
|
||||||
|
|
||||||
fxx = fxx - Gamxxx * chix - Gamyxx * chiy - Gamzxx * chiz
|
do k=1,ex(3)
|
||||||
fxy = fxy - Gamxxy * chix - Gamyxy * chiy - Gamzxy * chiz
|
do j=1,ex(2)
|
||||||
fxz = fxz - Gamxxz * chix - Gamyxz * chiy - Gamzxz * chiz
|
do i=1,ex(1)
|
||||||
fyy = fyy - Gamxyy * chix - Gamyyy * chiy - Gamzyy * chiz
|
fxx(i,j,k) = fxx(i,j,k) - Gamxxx(i,j,k) * chix(i,j,k) - Gamyxx(i,j,k) * chiy(i,j,k) - Gamzxx(i,j,k) * chiz(i,j,k)
|
||||||
fyz = fyz - Gamxyz * chix - Gamyyz * chiy - Gamzyz * chiz
|
fxy(i,j,k) = fxy(i,j,k) - Gamxxy(i,j,k) * chix(i,j,k) - Gamyxy(i,j,k) * chiy(i,j,k) - Gamzxy(i,j,k) * chiz(i,j,k)
|
||||||
fzz = fzz - Gamxzz * chix - Gamyzz * chiy - Gamzzz * chiz
|
fxz(i,j,k) = fxz(i,j,k) - Gamxxz(i,j,k) * chix(i,j,k) - Gamyxz(i,j,k) * chiy(i,j,k) - Gamzxz(i,j,k) * chiz(i,j,k)
|
||||||
! Store D^l D_l chi - 3/(2*chi) D^l chi D_l chi in f
|
fyy(i,j,k) = fyy(i,j,k) - Gamxyy(i,j,k) * chix(i,j,k) - Gamyyy(i,j,k) * chiy(i,j,k) - Gamzyy(i,j,k) * chiz(i,j,k)
|
||||||
|
fyz(i,j,k) = fyz(i,j,k) - Gamxyz(i,j,k) * chix(i,j,k) - Gamyyz(i,j,k) * chiy(i,j,k) - Gamzyz(i,j,k) * chiz(i,j,k)
|
||||||
f = gupxx * ( fxx - F3o2/chin1 * chix * chix ) + &
|
fzz(i,j,k) = fzz(i,j,k) - Gamxzz(i,j,k) * chix(i,j,k) - Gamyzz(i,j,k) * chiy(i,j,k) - Gamzzz(i,j,k) * chiz(i,j,k)
|
||||||
gupyy * ( fyy - F3o2/chin1 * chiy * chiy ) + &
|
|
||||||
gupzz * ( fzz - F3o2/chin1 * chiz * chiz ) + &
|
chin_loc = chin1(i,j,k)
|
||||||
TWO * gupxy * ( fxy - F3o2/chin1 * chix * chiy ) + &
|
f_loc = gupxx(i,j,k) * (fxx(i,j,k) - F3o2/chin_loc * chix(i,j,k) * chix(i,j,k)) + &
|
||||||
TWO * gupxz * ( fxz - F3o2/chin1 * chix * chiz ) + &
|
gupyy(i,j,k) * (fyy(i,j,k) - F3o2/chin_loc * chiy(i,j,k) * chiy(i,j,k)) + &
|
||||||
TWO * gupyz * ( fyz - F3o2/chin1 * chiy * chiz )
|
gupzz(i,j,k) * (fzz(i,j,k) - F3o2/chin_loc * chiz(i,j,k) * chiz(i,j,k)) + &
|
||||||
! Add chi part to Ricci tensor:
|
TWO * gupxy(i,j,k) * (fxy(i,j,k) - F3o2/chin_loc * chix(i,j,k) * chiy(i,j,k)) + &
|
||||||
|
TWO * gupxz(i,j,k) * (fxz(i,j,k) - F3o2/chin_loc * chix(i,j,k) * chiz(i,j,k)) + &
|
||||||
Rxx = Rxx + (fxx - chix*chix/chin1/TWO + gxx * f)/chin1/TWO
|
TWO * gupyz(i,j,k) * (fyz(i,j,k) - F3o2/chin_loc * chiy(i,j,k) * chiz(i,j,k))
|
||||||
Ryy = Ryy + (fyy - chiy*chiy/chin1/TWO + gyy * f)/chin1/TWO
|
f(i,j,k) = f_loc
|
||||||
Rzz = Rzz + (fzz - chiz*chiz/chin1/TWO + gzz * f)/chin1/TWO
|
|
||||||
Rxy = Rxy + (fxy - chix*chiy/chin1/TWO + gxy * f)/chin1/TWO
|
Rxx(i,j,k) = Rxx(i,j,k) + (fxx(i,j,k) - chix(i,j,k)*chix(i,j,k)/chin_loc/TWO + gxx(i,j,k) * f_loc)/chin_loc/TWO
|
||||||
Rxz = Rxz + (fxz - chix*chiz/chin1/TWO + gxz * f)/chin1/TWO
|
Ryy(i,j,k) = Ryy(i,j,k) + (fyy(i,j,k) - chiy(i,j,k)*chiy(i,j,k)/chin_loc/TWO + gyy(i,j,k) * f_loc)/chin_loc/TWO
|
||||||
Ryz = Ryz + (fyz - chiy*chiz/chin1/TWO + gyz * f)/chin1/TWO
|
Rzz(i,j,k) = Rzz(i,j,k) + (fzz(i,j,k) - chiz(i,j,k)*chiz(i,j,k)/chin_loc/TWO + gzz(i,j,k) * f_loc)/chin_loc/TWO
|
||||||
|
Rxy(i,j,k) = Rxy(i,j,k) + (fxy(i,j,k) - chix(i,j,k)*chiy(i,j,k)/chin_loc/TWO + gxy(i,j,k) * f_loc)/chin_loc/TWO
|
||||||
! covariant second derivatives of the lapse respect to physical metric
|
Rxz(i,j,k) = Rxz(i,j,k) + (fxz(i,j,k) - chix(i,j,k)*chiz(i,j,k)/chin_loc/TWO + gxz(i,j,k) * f_loc)/chin_loc/TWO
|
||||||
call fdderivs(ex,Lap,fxx,fxy,fxz,fyy,fyz,fzz,X,Y,Z, &
|
Ryz(i,j,k) = Ryz(i,j,k) + (fyz(i,j,k) - chiy(i,j,k)*chiz(i,j,k)/chin_loc/TWO + gyz(i,j,k) * f_loc)/chin_loc/TWO
|
||||||
SYM,SYM,SYM,symmetry,Lev)
|
enddo
|
||||||
|
enddo
|
||||||
gxxx = (gupxx * chix + gupxy * chiy + gupxz * chiz)/chin1
|
enddo
|
||||||
gxxy = (gupxy * chix + gupyy * chiy + gupyz * chiz)/chin1
|
|
||||||
gxxz = (gupxz * chix + gupyz * chiy + gupzz * chiz)/chin1
|
! covariant second derivatives of the lapse respect to physical metric
|
||||||
! now get physical second kind of connection
|
call fdderivs(ex,Lap,fxx,fxy,fxz,fyy,fyz,fzz,X,Y,Z, &
|
||||||
Gamxxx = Gamxxx - ( (chix + chix)/chin1 - gxx * gxxx )*HALF
|
SYM,SYM,SYM,symmetry,Lev)
|
||||||
Gamyxx = Gamyxx - ( - gxx * gxxy )*HALF
|
|
||||||
Gamzxx = Gamzxx - ( - gxx * gxxz )*HALF
|
do k=1,ex(3)
|
||||||
Gamxyy = Gamxyy - ( - gyy * gxxx )*HALF
|
do j=1,ex(2)
|
||||||
Gamyyy = Gamyyy - ( (chiy + chiy)/chin1 - gyy * gxxy )*HALF
|
do i=1,ex(1)
|
||||||
Gamzyy = Gamzyy - ( - gyy * gxxz )*HALF
|
chin_loc = chin1(i,j,k)
|
||||||
Gamxzz = Gamxzz - ( - gzz * gxxx )*HALF
|
gxxx(i,j,k) = (gupxx(i,j,k) * chix(i,j,k) + gupxy(i,j,k) * chiy(i,j,k) + gupxz(i,j,k) * chiz(i,j,k)) / chin_loc
|
||||||
Gamyzz = Gamyzz - ( - gzz * gxxy )*HALF
|
gxxy(i,j,k) = (gupxy(i,j,k) * chix(i,j,k) + gupyy(i,j,k) * chiy(i,j,k) + gupyz(i,j,k) * chiz(i,j,k)) / chin_loc
|
||||||
Gamzzz = Gamzzz - ( (chiz + chiz)/chin1 - gzz * gxxz )*HALF
|
gxxz(i,j,k) = (gupxz(i,j,k) * chix(i,j,k) + gupyz(i,j,k) * chiy(i,j,k) + gupzz(i,j,k) * chiz(i,j,k)) / chin_loc
|
||||||
Gamxxy = Gamxxy - ( chiy /chin1 - gxy * gxxx )*HALF
|
|
||||||
Gamyxy = Gamyxy - ( chix /chin1 - gxy * gxxy )*HALF
|
Gamxxx(i,j,k) = Gamxxx(i,j,k) - ( (chix(i,j,k) + chix(i,j,k))/chin_loc - gxx(i,j,k) * gxxx(i,j,k) )*HALF
|
||||||
Gamzxy = Gamzxy - ( - gxy * gxxz )*HALF
|
Gamyxx(i,j,k) = Gamyxx(i,j,k) - ( - gxx(i,j,k) * gxxy(i,j,k) )*HALF
|
||||||
Gamxxz = Gamxxz - ( chiz /chin1 - gxz * gxxx )*HALF
|
Gamzxx(i,j,k) = Gamzxx(i,j,k) - ( - gxx(i,j,k) * gxxz(i,j,k) )*HALF
|
||||||
Gamyxz = Gamyxz - ( - gxz * gxxy )*HALF
|
Gamxyy(i,j,k) = Gamxyy(i,j,k) - ( - gyy(i,j,k) * gxxx(i,j,k) )*HALF
|
||||||
Gamzxz = Gamzxz - ( chix /chin1 - gxz * gxxz )*HALF
|
Gamyyy(i,j,k) = Gamyyy(i,j,k) - ( (chiy(i,j,k) + chiy(i,j,k))/chin_loc - gyy(i,j,k) * gxxy(i,j,k) )*HALF
|
||||||
Gamxyz = Gamxyz - ( - gyz * gxxx )*HALF
|
Gamzyy(i,j,k) = Gamzyy(i,j,k) - ( - gyy(i,j,k) * gxxz(i,j,k) )*HALF
|
||||||
Gamyyz = Gamyyz - ( chiz /chin1 - gyz * gxxy )*HALF
|
Gamxzz(i,j,k) = Gamxzz(i,j,k) - ( - gzz(i,j,k) * gxxx(i,j,k) )*HALF
|
||||||
Gamzyz = Gamzyz - ( chiy /chin1 - gyz * gxxz )*HALF
|
Gamyzz(i,j,k) = Gamyzz(i,j,k) - ( - gzz(i,j,k) * gxxy(i,j,k) )*HALF
|
||||||
|
Gamzzz(i,j,k) = Gamzzz(i,j,k) - ( (chiz(i,j,k) + chiz(i,j,k))/chin_loc - gzz(i,j,k) * gxxz(i,j,k) )*HALF
|
||||||
fxx = fxx - Gamxxx*Lapx - Gamyxx*Lapy - Gamzxx*Lapz
|
Gamxxy(i,j,k) = Gamxxy(i,j,k) - ( chiy(i,j,k) /chin_loc - gxy(i,j,k) * gxxx(i,j,k) )*HALF
|
||||||
fyy = fyy - Gamxyy*Lapx - Gamyyy*Lapy - Gamzyy*Lapz
|
Gamyxy(i,j,k) = Gamyxy(i,j,k) - ( chix(i,j,k) /chin_loc - gxy(i,j,k) * gxxy(i,j,k) )*HALF
|
||||||
fzz = fzz - Gamxzz*Lapx - Gamyzz*Lapy - Gamzzz*Lapz
|
Gamzxy(i,j,k) = Gamzxy(i,j,k) - ( - gxy(i,j,k) * gxxz(i,j,k) )*HALF
|
||||||
fxy = fxy - Gamxxy*Lapx - Gamyxy*Lapy - Gamzxy*Lapz
|
Gamxxz(i,j,k) = Gamxxz(i,j,k) - ( chiz(i,j,k) /chin_loc - gxz(i,j,k) * gxxx(i,j,k) )*HALF
|
||||||
fxz = fxz - Gamxxz*Lapx - Gamyxz*Lapy - Gamzxz*Lapz
|
Gamyxz(i,j,k) = Gamyxz(i,j,k) - ( - gxz(i,j,k) * gxxy(i,j,k) )*HALF
|
||||||
fyz = fyz - Gamxyz*Lapx - Gamyyz*Lapy - Gamzyz*Lapz
|
Gamzxz(i,j,k) = Gamzxz(i,j,k) - ( chix(i,j,k) /chin_loc - gxz(i,j,k) * gxxz(i,j,k) )*HALF
|
||||||
|
Gamxyz(i,j,k) = Gamxyz(i,j,k) - ( - gyz(i,j,k) * gxxx(i,j,k) )*HALF
|
||||||
! store D^i D_i Lap in trK_rhs upto chi
|
Gamyyz(i,j,k) = Gamyyz(i,j,k) - ( chiz(i,j,k) /chin_loc - gyz(i,j,k) * gxxy(i,j,k) )*HALF
|
||||||
trK_rhs = gupxx * fxx + gupyy * fyy + gupzz * fzz + &
|
Gamzyz(i,j,k) = Gamzyz(i,j,k) - ( chiy(i,j,k) /chin_loc - gyz(i,j,k) * gxxz(i,j,k) )*HALF
|
||||||
TWO* ( gupxy * fxy + gupxz * fxz + gupyz * fyz )
|
|
||||||
#if 1
|
fxx(i,j,k) = fxx(i,j,k) - Gamxxx(i,j,k)*Lapx(i,j,k) - Gamyxx(i,j,k)*Lapy(i,j,k) - Gamzxx(i,j,k)*Lapz(i,j,k)
|
||||||
!! follow bam code
|
fyy(i,j,k) = fyy(i,j,k) - Gamxyy(i,j,k)*Lapx(i,j,k) - Gamyyy(i,j,k)*Lapy(i,j,k) - Gamzyy(i,j,k)*Lapz(i,j,k)
|
||||||
S = chin1 * ( gupxx * Sxx + gupyy * Syy + gupzz * Szz + &
|
fzz(i,j,k) = fzz(i,j,k) - Gamxzz(i,j,k)*Lapx(i,j,k) - Gamyzz(i,j,k)*Lapy(i,j,k) - Gamzzz(i,j,k)*Lapz(i,j,k)
|
||||||
TWO * ( gupxy * Sxy + gupxz * Sxz + gupyz * Syz ) )
|
fxy(i,j,k) = fxy(i,j,k) - Gamxxy(i,j,k)*Lapx(i,j,k) - Gamyxy(i,j,k)*Lapy(i,j,k) - Gamzxy(i,j,k)*Lapz(i,j,k)
|
||||||
f = F2o3 * trK * trK -(&
|
fxz(i,j,k) = fxz(i,j,k) - Gamxxz(i,j,k)*Lapx(i,j,k) - Gamyxz(i,j,k)*Lapy(i,j,k) - Gamzxz(i,j,k)*Lapz(i,j,k)
|
||||||
gupxx * ( &
|
fyz(i,j,k) = fyz(i,j,k) - Gamxyz(i,j,k)*Lapx(i,j,k) - Gamyyz(i,j,k)*Lapy(i,j,k) - Gamzyz(i,j,k)*Lapz(i,j,k)
|
||||||
gupxx * Axx * Axx + gupyy * Axy * Axy + gupzz * Axz * Axz + &
|
|
||||||
TWO * (gupxy * Axx * Axy + gupxz * Axx * Axz + gupyz * Axy * Axz) ) + &
|
trK_rhs(i,j,k) = gupxx(i,j,k) * fxx(i,j,k) + gupyy(i,j,k) * fyy(i,j,k) + gupzz(i,j,k) * fzz(i,j,k) + &
|
||||||
gupyy * ( &
|
TWO * (gupxy(i,j,k) * fxy(i,j,k) + gupxz(i,j,k) * fxz(i,j,k) + gupyz(i,j,k) * fyz(i,j,k))
|
||||||
gupxx * Axy * Axy + gupyy * Ayy * Ayy + gupzz * Ayz * Ayz + &
|
enddo
|
||||||
TWO * (gupxy * Axy * Ayy + gupxz * Axy * Ayz + gupyz * Ayy * Ayz) ) + &
|
enddo
|
||||||
gupzz * ( &
|
enddo
|
||||||
gupxx * Axz * Axz + gupyy * Ayz * Ayz + gupzz * Azz * Azz + &
|
do k=1,ex(3)
|
||||||
TWO * (gupxy * Axz * Ayz + gupxz * Axz * Azz + gupyz * Ayz * Azz) ) + &
|
do j=1,ex(2)
|
||||||
TWO * ( &
|
do i=1,ex(1)
|
||||||
gupxy * ( &
|
divb_loc = div_beta(i,j,k)
|
||||||
gupxx * Axx * Axy + gupyy * Axy * Ayy + gupzz * Axz * Ayz + &
|
chin_loc = chin1(i,j,k)
|
||||||
gupxy * (Axx * Ayy + Axy * Axy) + &
|
|
||||||
gupxz * (Axx * Ayz + Axz * Axy) + &
|
S_loc = chin_loc * ( gupxx(i,j,k) * Sxx(i,j,k) + gupyy(i,j,k) * Syy(i,j,k) + gupzz(i,j,k) * Szz(i,j,k) + &
|
||||||
gupyz * (Axy * Ayz + Axz * Ayy) ) + &
|
TWO * (gupxy(i,j,k) * Sxy(i,j,k) + gupxz(i,j,k) * Sxz(i,j,k) + gupyz(i,j,k) * Syz(i,j,k)) )
|
||||||
gupxz * ( &
|
S(i,j,k) = S_loc
|
||||||
gupxx * Axx * Axz + gupyy * Axy * Ayz + gupzz * Axz * Azz + &
|
|
||||||
gupxy * (Axx * Ayz + Axy * Axz) + &
|
f_loc = F2o3 * trK(i,j,k) * trK(i,j,k) - ( &
|
||||||
gupxz * (Axx * Azz + Axz * Axz) + &
|
gupxx(i,j,k) * ( gupxx(i,j,k) * Axx(i,j,k) * Axx(i,j,k) + gupyy(i,j,k) * Axy(i,j,k) * Axy(i,j,k) + &
|
||||||
gupyz * (Axy * Azz + Axz * Ayz) ) + &
|
gupzz(i,j,k) * Axz(i,j,k) * Axz(i,j,k) + &
|
||||||
gupyz * ( &
|
TWO * (gupxy(i,j,k) * Axx(i,j,k) * Axy(i,j,k) + gupxz(i,j,k) * Axx(i,j,k) * Axz(i,j,k) + &
|
||||||
gupxx * Axy * Axz + gupyy * Ayy * Ayz + gupzz * Ayz * Azz + &
|
gupyz(i,j,k) * Axy(i,j,k) * Axz(i,j,k)) ) + &
|
||||||
gupxy * (Axy * Ayz + Ayy * Axz) + &
|
gupyy(i,j,k) * ( gupxx(i,j,k) * Axy(i,j,k) * Axy(i,j,k) + gupyy(i,j,k) * Ayy(i,j,k) * Ayy(i,j,k) + &
|
||||||
gupxz * (Axy * Azz + Ayz * Axz) + &
|
gupzz(i,j,k) * Ayz(i,j,k) * Ayz(i,j,k) + &
|
||||||
gupyz * (Ayy * Azz + Ayz * Ayz) ) )) -1.6d1*PI*rho + EIGHT * PI * S
|
TWO * (gupxy(i,j,k) * Axy(i,j,k) * Ayy(i,j,k) + gupxz(i,j,k) * Axy(i,j,k) * Ayz(i,j,k) + &
|
||||||
f = - F1o3 *( gupxx * fxx + gupyy * fyy + gupzz * fzz + &
|
gupyz(i,j,k) * Ayy(i,j,k) * Ayz(i,j,k)) ) + &
|
||||||
TWO* ( gupxy * fxy + gupxz * fxz + gupyz * fyz ) + alpn1/chin1*f)
|
gupzz(i,j,k) * ( gupxx(i,j,k) * Axz(i,j,k) * Axz(i,j,k) + gupyy(i,j,k) * Ayz(i,j,k) * Ayz(i,j,k) + &
|
||||||
|
gupzz(i,j,k) * Azz(i,j,k) * Azz(i,j,k) + &
|
||||||
fxx = alpn1 * (Rxx - EIGHT * PI * Sxx) - fxx
|
TWO * (gupxy(i,j,k) * Axz(i,j,k) * Ayz(i,j,k) + gupxz(i,j,k) * Axz(i,j,k) * Azz(i,j,k) + &
|
||||||
fxy = alpn1 * (Rxy - EIGHT * PI * Sxy) - fxy
|
gupyz(i,j,k) * Ayz(i,j,k) * Azz(i,j,k)) ) + &
|
||||||
fxz = alpn1 * (Rxz - EIGHT * PI * Sxz) - fxz
|
TWO * ( gupxy(i,j,k) * ( gupxx(i,j,k) * Axx(i,j,k) * Axy(i,j,k) + gupyy(i,j,k) * Axy(i,j,k) * Ayy(i,j,k) + &
|
||||||
fyy = alpn1 * (Ryy - EIGHT * PI * Syy) - fyy
|
gupzz(i,j,k) * Axz(i,j,k) * Ayz(i,j,k) + &
|
||||||
fyz = alpn1 * (Ryz - EIGHT * PI * Syz) - fyz
|
gupxy(i,j,k) * (Axx(i,j,k) * Ayy(i,j,k) + Axy(i,j,k) * Axy(i,j,k)) + &
|
||||||
fzz = alpn1 * (Rzz - EIGHT * PI * Szz) - fzz
|
gupxz(i,j,k) * (Axx(i,j,k) * Ayz(i,j,k) + Axz(i,j,k) * Axy(i,j,k)) + &
|
||||||
#else
|
gupyz(i,j,k) * (Axy(i,j,k) * Ayz(i,j,k) + Axz(i,j,k) * Ayy(i,j,k)) ) + &
|
||||||
! Add lapse and S_ij parts to Ricci tensor:
|
gupxz(i,j,k) * ( gupxx(i,j,k) * Axx(i,j,k) * Axz(i,j,k) + gupyy(i,j,k) * Axy(i,j,k) * Ayz(i,j,k) + &
|
||||||
|
gupzz(i,j,k) * Axz(i,j,k) * Azz(i,j,k) + &
|
||||||
fxx = alpn1 * (Rxx - EIGHT * PI * Sxx) - fxx
|
gupxy(i,j,k) * (Axx(i,j,k) * Ayz(i,j,k) + Axy(i,j,k) * Axz(i,j,k)) + &
|
||||||
fxy = alpn1 * (Rxy - EIGHT * PI * Sxy) - fxy
|
gupxz(i,j,k) * (Axx(i,j,k) * Azz(i,j,k) + Axz(i,j,k) * Axz(i,j,k)) + &
|
||||||
fxz = alpn1 * (Rxz - EIGHT * PI * Sxz) - fxz
|
gupyz(i,j,k) * (Axy(i,j,k) * Azz(i,j,k) + Axz(i,j,k) * Ayz(i,j,k)) ) + &
|
||||||
fyy = alpn1 * (Ryy - EIGHT * PI * Syy) - fyy
|
gupyz(i,j,k) * ( gupxx(i,j,k) * Axy(i,j,k) * Axz(i,j,k) + gupyy(i,j,k) * Ayy(i,j,k) * Ayz(i,j,k) + &
|
||||||
fyz = alpn1 * (Ryz - EIGHT * PI * Syz) - fyz
|
gupzz(i,j,k) * Ayz(i,j,k) * Azz(i,j,k) + &
|
||||||
fzz = alpn1 * (Rzz - EIGHT * PI * Szz) - fzz
|
gupxy(i,j,k) * (Axy(i,j,k) * Ayz(i,j,k) + Ayy(i,j,k) * Axz(i,j,k)) + &
|
||||||
|
gupxz(i,j,k) * (Axy(i,j,k) * Azz(i,j,k) + Ayz(i,j,k) * Axz(i,j,k)) + &
|
||||||
! Compute trace-free part (note: chi^-1 and chi cancel!):
|
gupyz(i,j,k) * (Ayy(i,j,k) * Azz(i,j,k) + Ayz(i,j,k) * Ayz(i,j,k)) ) ) ) - &
|
||||||
|
F16 * PI * rho(i,j,k) + EIGHT * PI * S_loc
|
||||||
f = F1o3 *( gupxx * fxx + gupyy * fyy + gupzz * fzz + &
|
|
||||||
TWO* ( gupxy * fxy + gupxz * fxz + gupyz * fyz ) )
|
f_loc = -F1o3 * ( gupxx(i,j,k) * fxx(i,j,k) + gupyy(i,j,k) * fyy(i,j,k) + gupzz(i,j,k) * fzz(i,j,k) + &
|
||||||
#endif
|
TWO * (gupxy(i,j,k) * fxy(i,j,k) + gupxz(i,j,k) * fxz(i,j,k) + gupyz(i,j,k) * fyz(i,j,k)) + &
|
||||||
|
alpn1(i,j,k)/chin_loc * f_loc )
|
||||||
Axx_rhs = fxx - gxx * f
|
f(i,j,k) = f_loc
|
||||||
Ayy_rhs = fyy - gyy * f
|
|
||||||
Azz_rhs = fzz - gzz * f
|
l_fxx = alpn1(i,j,k) * (Rxx(i,j,k) - EIGHT * PI * Sxx(i,j,k)) - fxx(i,j,k)
|
||||||
Axy_rhs = fxy - gxy * f
|
l_fxy = alpn1(i,j,k) * (Rxy(i,j,k) - EIGHT * PI * Sxy(i,j,k)) - fxy(i,j,k)
|
||||||
Axz_rhs = fxz - gxz * f
|
l_fxz = alpn1(i,j,k) * (Rxz(i,j,k) - EIGHT * PI * Sxz(i,j,k)) - fxz(i,j,k)
|
||||||
Ayz_rhs = fyz - gyz * f
|
l_fyy = alpn1(i,j,k) * (Ryy(i,j,k) - EIGHT * PI * Syy(i,j,k)) - fyy(i,j,k)
|
||||||
|
l_fyz = alpn1(i,j,k) * (Ryz(i,j,k) - EIGHT * PI * Syz(i,j,k)) - fyz(i,j,k)
|
||||||
! Now: store A_il A^l_j into fij:
|
l_fzz = alpn1(i,j,k) * (Rzz(i,j,k) - EIGHT * PI * Szz(i,j,k)) - fzz(i,j,k)
|
||||||
|
|
||||||
fxx = gupxx * Axx * Axx + gupyy * Axy * Axy + gupzz * Axz * Axz + &
|
Axx_rhs(i,j,k) = l_fxx - gxx(i,j,k) * f_loc
|
||||||
TWO * (gupxy * Axx * Axy + gupxz * Axx * Axz + gupyz * Axy * Axz)
|
Ayy_rhs(i,j,k) = l_fyy - gyy(i,j,k) * f_loc
|
||||||
fyy = gupxx * Axy * Axy + gupyy * Ayy * Ayy + gupzz * Ayz * Ayz + &
|
Azz_rhs(i,j,k) = l_fzz - gzz(i,j,k) * f_loc
|
||||||
TWO * (gupxy * Axy * Ayy + gupxz * Axy * Ayz + gupyz * Ayy * Ayz)
|
Axy_rhs(i,j,k) = l_fxy - gxy(i,j,k) * f_loc
|
||||||
fzz = gupxx * Axz * Axz + gupyy * Ayz * Ayz + gupzz * Azz * Azz + &
|
Axz_rhs(i,j,k) = l_fxz - gxz(i,j,k) * f_loc
|
||||||
TWO * (gupxy * Axz * Ayz + gupxz * Axz * Azz + gupyz * Ayz * Azz)
|
Ayz_rhs(i,j,k) = l_fyz - gyz(i,j,k) * f_loc
|
||||||
fxy = gupxx * Axx * Axy + gupyy * Axy * Ayy + gupzz * Axz * Ayz + &
|
|
||||||
gupxy *(Axx * Ayy + Axy * Axy) + &
|
fxx(i,j,k) = gupxx(i,j,k) * Axx(i,j,k) * Axx(i,j,k) + gupyy(i,j,k) * Axy(i,j,k) * Axy(i,j,k) + &
|
||||||
gupxz *(Axx * Ayz + Axz * Axy) + &
|
gupzz(i,j,k) * Axz(i,j,k) * Axz(i,j,k) + TWO * (gupxy(i,j,k) * Axx(i,j,k) * Axy(i,j,k) + &
|
||||||
gupyz *(Axy * Ayz + Axz * Ayy)
|
gupxz(i,j,k) * Axx(i,j,k) * Axz(i,j,k) + gupyz(i,j,k) * Axy(i,j,k) * Axz(i,j,k))
|
||||||
fxz = gupxx * Axx * Axz + gupyy * Axy * Ayz + gupzz * Axz * Azz + &
|
fyy(i,j,k) = gupxx(i,j,k) * Axy(i,j,k) * Axy(i,j,k) + gupyy(i,j,k) * Ayy(i,j,k) * Ayy(i,j,k) + &
|
||||||
gupxy *(Axx * Ayz + Axy * Axz) + &
|
gupzz(i,j,k) * Ayz(i,j,k) * Ayz(i,j,k) + TWO * (gupxy(i,j,k) * Axy(i,j,k) * Ayy(i,j,k) + &
|
||||||
gupxz *(Axx * Azz + Axz * Axz) + &
|
gupxz(i,j,k) * Axy(i,j,k) * Ayz(i,j,k) + gupyz(i,j,k) * Ayy(i,j,k) * Ayz(i,j,k))
|
||||||
gupyz *(Axy * Azz + Axz * Ayz)
|
fzz(i,j,k) = gupxx(i,j,k) * Axz(i,j,k) * Axz(i,j,k) + gupyy(i,j,k) * Ayz(i,j,k) * Ayz(i,j,k) + &
|
||||||
fyz = gupxx * Axy * Axz + gupyy * Ayy * Ayz + gupzz * Ayz * Azz + &
|
gupzz(i,j,k) * Azz(i,j,k) * Azz(i,j,k) + TWO * (gupxy(i,j,k) * Axz(i,j,k) * Ayz(i,j,k) + &
|
||||||
gupxy *(Axy * Ayz + Ayy * Axz) + &
|
gupxz(i,j,k) * Axz(i,j,k) * Azz(i,j,k) + gupyz(i,j,k) * Ayz(i,j,k) * Azz(i,j,k))
|
||||||
gupxz *(Axy * Azz + Ayz * Axz) + &
|
fxy(i,j,k) = gupxx(i,j,k) * Axx(i,j,k) * Axy(i,j,k) + gupyy(i,j,k) * Axy(i,j,k) * Ayy(i,j,k) + &
|
||||||
gupyz *(Ayy * Azz + Ayz * Ayz)
|
gupzz(i,j,k) * Axz(i,j,k) * Ayz(i,j,k) + gupxy(i,j,k) * (Axx(i,j,k) * Ayy(i,j,k) + Axy(i,j,k) * Axy(i,j,k)) + &
|
||||||
|
gupxz(i,j,k) * (Axx(i,j,k) * Ayz(i,j,k) + Axz(i,j,k) * Axy(i,j,k)) + &
|
||||||
f = chin1
|
gupyz(i,j,k) * (Axy(i,j,k) * Ayz(i,j,k) + Axz(i,j,k) * Ayy(i,j,k))
|
||||||
! store D^i D_i Lap in trK_rhs
|
fxz(i,j,k) = gupxx(i,j,k) * Axx(i,j,k) * Axz(i,j,k) + gupyy(i,j,k) * Axy(i,j,k) * Ayz(i,j,k) + &
|
||||||
trK_rhs = f*trK_rhs
|
gupzz(i,j,k) * Axz(i,j,k) * Azz(i,j,k) + gupxy(i,j,k) * (Axx(i,j,k) * Ayz(i,j,k) + Axy(i,j,k) * Axz(i,j,k)) + &
|
||||||
|
gupxz(i,j,k) * (Axx(i,j,k) * Azz(i,j,k) + Axz(i,j,k) * Axz(i,j,k)) + &
|
||||||
Axx_rhs = f * Axx_rhs+ alpn1 * (trK * Axx - TWO * fxx) + &
|
gupyz(i,j,k) * (Axy(i,j,k) * Azz(i,j,k) + Axz(i,j,k) * Ayz(i,j,k))
|
||||||
TWO * ( Axx * betaxx + Axy * betayx + Axz * betazx )- &
|
fyz(i,j,k) = gupxx(i,j,k) * Axy(i,j,k) * Axz(i,j,k) + gupyy(i,j,k) * Ayy(i,j,k) * Ayz(i,j,k) + &
|
||||||
F2o3 * Axx * div_beta
|
gupzz(i,j,k) * Ayz(i,j,k) * Azz(i,j,k) + gupxy(i,j,k) * (Axy(i,j,k) * Ayz(i,j,k) + Ayy(i,j,k) * Axz(i,j,k)) + &
|
||||||
|
gupxz(i,j,k) * (Axy(i,j,k) * Azz(i,j,k) + Ayz(i,j,k) * Axz(i,j,k)) + &
|
||||||
Ayy_rhs = f * Ayy_rhs+ alpn1 * (trK * Ayy - TWO * fyy) + &
|
gupyz(i,j,k) * (Ayy(i,j,k) * Azz(i,j,k) + Ayz(i,j,k) * Ayz(i,j,k))
|
||||||
TWO * ( Axy * betaxy + Ayy * betayy + Ayz * betazy )- &
|
|
||||||
F2o3 * Ayy * div_beta
|
trK_rhs(i,j,k) = chin_loc * trK_rhs(i,j,k)
|
||||||
|
|
||||||
Azz_rhs = f * Azz_rhs+ alpn1 * (trK * Azz - TWO * fzz) + &
|
Axx_rhs(i,j,k) = chin_loc * Axx_rhs(i,j,k) + alpn1(i,j,k) * (trK(i,j,k) * Axx(i,j,k) - TWO * fxx(i,j,k)) + &
|
||||||
TWO * ( Axz * betaxz + Ayz * betayz + Azz * betazz )- &
|
TWO * (Axx(i,j,k) * betaxx(i,j,k) + Axy(i,j,k) * betayx(i,j,k) + Axz(i,j,k) * betazx(i,j,k)) - &
|
||||||
F2o3 * Azz * div_beta
|
F2o3 * Axx(i,j,k) * divb_loc
|
||||||
|
Ayy_rhs(i,j,k) = chin_loc * Ayy_rhs(i,j,k) + alpn1(i,j,k) * (trK(i,j,k) * Ayy(i,j,k) - TWO * fyy(i,j,k)) + &
|
||||||
Axy_rhs = f * Axy_rhs+ alpn1 *( trK * Axy - TWO * fxy )+ &
|
TWO * (Axy(i,j,k) * betaxy(i,j,k) + Ayy(i,j,k) * betayy(i,j,k) + Ayz(i,j,k) * betazy(i,j,k)) - &
|
||||||
Axx * betaxy + Axz * betazy + &
|
F2o3 * Ayy(i,j,k) * divb_loc
|
||||||
Ayy * betayx + Ayz * betazx + &
|
Azz_rhs(i,j,k) = chin_loc * Azz_rhs(i,j,k) + alpn1(i,j,k) * (trK(i,j,k) * Azz(i,j,k) - TWO * fzz(i,j,k)) + &
|
||||||
F1o3 * Axy * div_beta - Axy * betazz
|
TWO * (Axz(i,j,k) * betaxz(i,j,k) + Ayz(i,j,k) * betayz(i,j,k) + Azz(i,j,k) * betazz(i,j,k)) - &
|
||||||
|
F2o3 * Azz(i,j,k) * divb_loc
|
||||||
Ayz_rhs = f * Ayz_rhs+ alpn1 *( trK * Ayz - TWO * fyz )+ &
|
Axy_rhs(i,j,k) = chin_loc * Axy_rhs(i,j,k) + alpn1(i,j,k) * (trK(i,j,k) * Axy(i,j,k) - TWO * fxy(i,j,k)) + &
|
||||||
Axy * betaxz + Ayy * betayz + &
|
Axx(i,j,k) * betaxy(i,j,k) + Axz(i,j,k) * betazy(i,j,k) + Ayy(i,j,k) * betayx(i,j,k) + &
|
||||||
Axz * betaxy + Azz * betazy + &
|
Ayz(i,j,k) * betazx(i,j,k) + F1o3 * Axy(i,j,k) * divb_loc - Axy(i,j,k) * betazz(i,j,k)
|
||||||
F1o3 * Ayz * div_beta - Ayz * betaxx
|
Ayz_rhs(i,j,k) = chin_loc * Ayz_rhs(i,j,k) + alpn1(i,j,k) * (trK(i,j,k) * Ayz(i,j,k) - TWO * fyz(i,j,k)) + &
|
||||||
|
Axy(i,j,k) * betaxz(i,j,k) + Ayy(i,j,k) * betayz(i,j,k) + Axz(i,j,k) * betaxy(i,j,k) + &
|
||||||
Axz_rhs = f * Axz_rhs+ alpn1 *( trK * Axz - TWO * fxz )+ &
|
Azz(i,j,k) * betazy(i,j,k) + F1o3 * Ayz(i,j,k) * divb_loc - Ayz(i,j,k) * betaxx(i,j,k)
|
||||||
Axx * betaxz + Axy * betayz + &
|
Axz_rhs(i,j,k) = chin_loc * Axz_rhs(i,j,k) + alpn1(i,j,k) * (trK(i,j,k) * Axz(i,j,k) - TWO * fxz(i,j,k)) + &
|
||||||
Ayz * betayx + Azz * betazx + &
|
Axx(i,j,k) * betaxz(i,j,k) + Axy(i,j,k) * betayz(i,j,k) + Ayz(i,j,k) * betayx(i,j,k) + &
|
||||||
F1o3 * Axz * div_beta - Axz * betayy !rhs for Aij
|
Azz(i,j,k) * betazx(i,j,k) + F1o3 * Axz(i,j,k) * divb_loc - Axz(i,j,k) * betayy(i,j,k)
|
||||||
|
|
||||||
! Compute trace of S_ij
|
trK_rhs(i,j,k) = - trK_rhs(i,j,k) + alpn1(i,j,k) * ( F1o3 * trK(i,j,k) * trK(i,j,k) + &
|
||||||
|
gupxx(i,j,k) * fxx(i,j,k) + gupyy(i,j,k) * fyy(i,j,k) + gupzz(i,j,k) * fzz(i,j,k) + &
|
||||||
S = f * ( gupxx * Sxx + gupyy * Syy + gupzz * Szz + &
|
TWO * (gupxy(i,j,k) * fxy(i,j,k) + gupxz(i,j,k) * fxz(i,j,k) + gupyz(i,j,k) * fyz(i,j,k)) + &
|
||||||
TWO * ( gupxy * Sxy + gupxz * Sxz + gupyz * Syz ) )
|
FOUR * PI * (rho(i,j,k) + S_loc) )
|
||||||
|
enddo
|
||||||
trK_rhs = - trK_rhs + alpn1 *( F1o3 * trK * trK + &
|
enddo
|
||||||
gupxx * fxx + gupyy * fyy + gupzz * fzz + &
|
enddo
|
||||||
TWO * ( gupxy * fxy + gupxz * fxz + gupyz * fyz ) + &
|
|
||||||
FOUR * PI * ( rho + S )) !rhs for trK
|
|
||||||
|
|
||||||
!!!! gauge variable part
|
!!!! gauge variable part
|
||||||
|
|
||||||
@@ -948,15 +1000,15 @@
|
|||||||
!!!!!!!!!advection term + Kreiss-Oliger dissipation (merged for cache efficiency)
|
!!!!!!!!!advection term + Kreiss-Oliger dissipation (merged for cache efficiency)
|
||||||
! lopsided_kodis shares the symmetry_bd buffer between advection and
|
! lopsided_kodis shares the symmetry_bd buffer between advection and
|
||||||
! dissipation, eliminating redundant full-grid copies. For metric variables
|
! dissipation, eliminating redundant full-grid copies. For metric variables
|
||||||
! gxx/gyy/gzz (=dxx/dyy/dzz+1): kodis stencil coefficients sum to zero,
|
! gxx/gyy/gzz (=dxx/dyy/dzz+1): stencil coefficients sum to zero,
|
||||||
! so the constant offset has no effect on dissipation.
|
! so the constant offset has no effect on dissipation.
|
||||||
|
|
||||||
call lopsided_kodis(ex,X,Y,Z,gxx,gxx_rhs,betax,betay,betaz,Symmetry,SSS,eps)
|
call lopsided_kodis(ex,X,Y,Z,dxx,gxx_rhs,betax,betay,betaz,Symmetry,SSS,eps)
|
||||||
call lopsided_kodis(ex,X,Y,Z,gxy,gxy_rhs,betax,betay,betaz,Symmetry,AAS,eps)
|
call lopsided_kodis(ex,X,Y,Z,gxy,gxy_rhs,betax,betay,betaz,Symmetry,AAS,eps)
|
||||||
call lopsided_kodis(ex,X,Y,Z,gxz,gxz_rhs,betax,betay,betaz,Symmetry,ASA,eps)
|
call lopsided_kodis(ex,X,Y,Z,gxz,gxz_rhs,betax,betay,betaz,Symmetry,ASA,eps)
|
||||||
call lopsided_kodis(ex,X,Y,Z,gyy,gyy_rhs,betax,betay,betaz,Symmetry,SSS,eps)
|
call lopsided_kodis(ex,X,Y,Z,dyy,gyy_rhs,betax,betay,betaz,Symmetry,SSS,eps)
|
||||||
call lopsided_kodis(ex,X,Y,Z,gyz,gyz_rhs,betax,betay,betaz,Symmetry,SAA,eps)
|
call lopsided_kodis(ex,X,Y,Z,gyz,gyz_rhs,betax,betay,betaz,Symmetry,SAA,eps)
|
||||||
call lopsided_kodis(ex,X,Y,Z,gzz,gzz_rhs,betax,betay,betaz,Symmetry,SSS,eps)
|
call lopsided_kodis(ex,X,Y,Z,dzz,gzz_rhs,betax,betay,betaz,Symmetry,SSS,eps)
|
||||||
|
|
||||||
call lopsided_kodis(ex,X,Y,Z,Axx,Axx_rhs,betax,betay,betaz,Symmetry,SSS,eps)
|
call lopsided_kodis(ex,X,Y,Z,Axx,Axx_rhs,betax,betay,betaz,Symmetry,SSS,eps)
|
||||||
call lopsided_kodis(ex,X,Y,Z,Axy,Axy_rhs,betax,betay,betaz,Symmetry,AAS,eps)
|
call lopsided_kodis(ex,X,Y,Z,Axy,Axy_rhs,betax,betay,betaz,Symmetry,AAS,eps)
|
||||||
|
|||||||
@@ -39,7 +39,6 @@ int f_compute_rhs_bssn(int *ex, double &T,
|
|||||||
// printf("nx=%d ny=%d nz=%d all=%d\n", nx, ny, nz, all);
|
// printf("nx=%d ny=%d nz=%d all=%d\n", nx, ny, nz, all);
|
||||||
|
|
||||||
// temp variable
|
// temp variable
|
||||||
double gxx[all],gyy[all],gzz[all];
|
|
||||||
double chix[all],chiy[all],chiz[all];
|
double chix[all],chiy[all],chiz[all];
|
||||||
double gxxx[all],gxyx[all],gxzx[all],gyyx[all],gyzx[all],gzzx[all];
|
double gxxx[all],gxyx[all],gxzx[all],gyyx[all],gyzx[all],gzzx[all];
|
||||||
double gxxy[all],gxyy[all],gxzy[all],gyyy[all],gyzy[all],gzzy[all];
|
double gxxy[all],gxyy[all],gxzy[all],gyyy[all],gyzy[all],gzzy[all];
|
||||||
@@ -51,9 +50,9 @@ int f_compute_rhs_bssn(int *ex, double &T,
|
|||||||
double Gamxx[all],Gamxy[all],Gamxz[all];
|
double Gamxx[all],Gamxy[all],Gamxz[all];
|
||||||
double Gamyx[all],Gamyy[all],Gamyz[all];
|
double Gamyx[all],Gamyy[all],Gamyz[all];
|
||||||
double Gamzx[all],Gamzy[all],Gamzz[all];
|
double Gamzx[all],Gamzy[all],Gamzz[all];
|
||||||
double Kx[all], Ky[all], Kz[all], div_beta[all], S[all];
|
double Kx[all], Ky[all], Kz[all], S[all];
|
||||||
double f[all], fxx[all], fxy[all], fxz[all], fyy[all], fyz[all], fzz[all];
|
double f[all], fxx[all], fxy[all], fxz[all], fyy[all], fyz[all], fzz[all];
|
||||||
double Gamxa[all], Gamya[all], Gamza[all], alpn1[all], chin1[all];
|
double alpn1[all], chin1[all];
|
||||||
double gupxx[all], gupxy[all], gupxz[all];
|
double gupxx[all], gupxy[all], gupxz[all];
|
||||||
double gupyy[all], gupyz[all], gupzz[all];
|
double gupyy[all], gupyz[all], gupzz[all];
|
||||||
double SSS[3] = { 1.0, 1.0, 1.0};
|
double SSS[3] = { 1.0, 1.0, 1.0};
|
||||||
@@ -107,9 +106,6 @@ int f_compute_rhs_bssn(int *ex, double &T,
|
|||||||
for(int i=0;i<all;i+=1){
|
for(int i=0;i<all;i+=1){
|
||||||
alpn1[i] = Lap[i] + 1.0;
|
alpn1[i] = Lap[i] + 1.0;
|
||||||
chin1[i] = chi[i] + 1.0;
|
chin1[i] = chi[i] + 1.0;
|
||||||
gxx[i] = dxx[i] + 1.0;
|
|
||||||
gyy[i] = dyy[i] + 1.0;
|
|
||||||
gzz[i] = dzz[i] + 1.0;
|
|
||||||
}
|
}
|
||||||
// 9ms //
|
// 9ms //
|
||||||
fderivs(ex,betax,betaxx,betaxy,betaxz,X,Y,Z,ANTI, SYM, SYM,Symmetry,Lev);
|
fderivs(ex,betax,betaxx,betaxy,betaxz,X,Y,Z,ANTI, SYM, SYM,Symmetry,Lev);
|
||||||
@@ -127,231 +123,196 @@ int f_compute_rhs_bssn(int *ex, double &T,
|
|||||||
|
|
||||||
// 3ms //
|
// 3ms //
|
||||||
for(int i=0;i<all;i+=1){
|
for(int i=0;i<all;i+=1){
|
||||||
div_beta[i] = betaxx[i] + betayy[i] + betazz[i];
|
const double divb = betaxx[i] + betayy[i] + betazz[i];
|
||||||
chi_rhs[i] = F2o3 * chin1[i] * (alpn1[i] * trK[i] - div_beta[i]);
|
chi_rhs[i] = F2o3 * chin1[i] * (alpn1[i] * trK[i] - divb);
|
||||||
gxx_rhs[i] = -TWO * alpn1[i] * Axx[i] - F2o3 * gxx[i] * div_beta[i] +
|
gxx_rhs[i] = -TWO * alpn1[i] * Axx[i] - F2o3 * (dxx[i] + ONE) * divb +
|
||||||
TWO * (gxx[i] * betaxx[i] + gxy[i] * betayx[i] + gxz[i] * betazx[i]);
|
TWO * ((dxx[i] + ONE) * betaxx[i] + gxy[i] * betayx[i] + gxz[i] * betazx[i]);
|
||||||
gyy_rhs[i] = -TWO * alpn1[i] * Ayy[i] - F2o3 * gyy[i] * div_beta[i] +
|
gyy_rhs[i] = -TWO * alpn1[i] * Ayy[i] - F2o3 * (dyy[i] + ONE) * divb +
|
||||||
TWO * (gxy[i] * betaxy[i] + gyy[i] * betayy[i] + gyz[i] * betazy[i]);
|
TWO * (gxy[i] * betaxy[i] + (dyy[i] + ONE) * betayy[i] + gyz[i] * betazy[i]);
|
||||||
gzz_rhs[i] = -TWO * alpn1[i] * Azz[i] - F2o3 * gzz[i] * div_beta[i] +
|
gzz_rhs[i] = -TWO * alpn1[i] * Azz[i] - F2o3 * (dzz[i] + ONE) * divb +
|
||||||
TWO * (gxz[i] * betaxz[i] + gyz[i] * betayz[i] + gzz[i] * betazz[i]);
|
TWO * (gxz[i] * betaxz[i] + gyz[i] * betayz[i] + (dzz[i] + ONE) * betazz[i]);
|
||||||
gxy_rhs[i] = -TWO * alpn1[i] * Axy[i] + F1o3 * gxy[i] * div_beta[i] +
|
gxy_rhs[i] = -TWO * alpn1[i] * Axy[i] + F1o3 * gxy[i] * divb +
|
||||||
gxx[i] * betaxy[i] + gxz[i] * betazy[i] + gyy[i] * betayx[i]
|
(dxx[i] + ONE) * betaxy[i] + gxz[i] * betazy[i] + (dyy[i] + ONE) * betayx[i]
|
||||||
+ gyz[i] * betazx[i] - gxy[i] * betazz[i];
|
+ gyz[i] * betazx[i] - gxy[i] * betazz[i];
|
||||||
gyz_rhs[i] = -TWO * alpn1[i] * Ayz[i] + F1o3 * gyz[i] * div_beta[i] +
|
gyz_rhs[i] = -TWO * alpn1[i] * Ayz[i] + F1o3 * gyz[i] * divb +
|
||||||
gxy[i] * betaxz[i] + gyy[i] * betayz[i] + gxz[i] * betaxy[i]
|
gxy[i] * betaxz[i] + (dyy[i] + ONE) * betayz[i] + gxz[i] * betaxy[i]
|
||||||
+ gzz[i] * betazy[i] - gyz[i] * betaxx[i];
|
+ (dzz[i] + ONE) * betazy[i] - gyz[i] * betaxx[i];
|
||||||
gxz_rhs[i] = -TWO * alpn1[i] * Axz[i] + F1o3 * gxz[i] * div_beta[i] +
|
gxz_rhs[i] = -TWO * alpn1[i] * Axz[i] + F1o3 * gxz[i] * divb +
|
||||||
gxx[i] * betaxz[i] + gxy[i] * betayz[i] + gyz[i] * betayx[i]
|
(dxx[i] + ONE) * betaxz[i] + gxy[i] * betayz[i] + gyz[i] * betayx[i]
|
||||||
+ gzz[i] * betazx[i] - gxz[i] * betayy[i];
|
+ (dzz[i] + ONE) * betazx[i] - gxz[i] * betayy[i];
|
||||||
}
|
}
|
||||||
// 1ms //
|
// Fused: inverse metric + Gamma constraint + Christoffel (3 loops -> 1)
|
||||||
for(int i=0;i<all;i+=1){
|
for(int i=0;i<all;i+=1){
|
||||||
double det = gxx[i] * gyy[i] * gzz[i] + gxy[i] * gyz[i] * gxz[i] + gxz[i] * gxy[i] * gyz[i] -
|
double det = (dxx[i] + ONE) * (dyy[i] + ONE) * (dzz[i] + ONE) + gxy[i] * gyz[i] * gxz[i] + gxz[i] * gxy[i] * gyz[i] -
|
||||||
gxz[i] * gyy[i] * gxz[i] - gxy[i] * gxy[i] * gzz[i] - gxx[i] * gyz[i] * gyz[i];
|
gxz[i] * (dyy[i] + ONE) * gxz[i] - gxy[i] * gxy[i] * (dzz[i] + ONE) - (dxx[i] + ONE) * gyz[i] * gyz[i];
|
||||||
gupxx[i] = (gyy[i] * gzz[i] - gyz[i] * gyz[i]) / det;
|
double lg_xx = ((dyy[i] + ONE) * (dzz[i] + ONE) - gyz[i] * gyz[i]) / det;
|
||||||
gupxy[i] = -(gxy[i] * gzz[i] - gyz[i] * gxz[i]) / det;
|
double lg_xy = -(gxy[i] * (dzz[i] + ONE) - gyz[i] * gxz[i]) / det;
|
||||||
gupxz[i] = (gxy[i] * gyz[i] - gyy[i] * gxz[i]) / det;
|
double lg_xz = (gxy[i] * gyz[i] - (dyy[i] + ONE) * gxz[i]) / det;
|
||||||
gupyy[i] = (gxx[i] * gzz[i] - gxz[i] * gxz[i]) / det;
|
double lg_yy = ((dxx[i] + ONE) * (dzz[i] + ONE) - gxz[i] * gxz[i]) / det;
|
||||||
gupyz[i] = -(gxx[i] * gyz[i] - gxy[i] * gxz[i]) / det;
|
double lg_yz = -((dxx[i] + ONE) * gyz[i] - gxy[i] * gxz[i]) / det;
|
||||||
gupzz[i] = (gxx[i] * gyy[i] - gxy[i] * gxy[i]) / det;
|
double lg_zz = ((dxx[i] + ONE) * (dyy[i] + ONE) - gxy[i] * gxy[i]) / det;
|
||||||
}
|
gupxx[i] = lg_xx; gupxy[i] = lg_xy; gupxz[i] = lg_xz;
|
||||||
// 2.2ms //
|
gupyy[i] = lg_yy; gupyz[i] = lg_yz; gupzz[i] = lg_zz;
|
||||||
if(co==0){
|
|
||||||
for (int i=0;i<all;i+=1) {
|
if(co==0){
|
||||||
Gmx_Res[i] = Gamx[i] - (
|
Gmx_Res[i] = Gamx[i] - (
|
||||||
gupxx[i] * (gupxx[i]*gxxx[i] + gupxy[i]*gxyx[i] + gupxz[i]*gxzx[i]) +
|
lg_xx * (lg_xx*gxxx[i] + lg_xy*gxyx[i] + lg_xz*gxzx[i]) +
|
||||||
gupxy[i] * (gupxx[i]*gxyx[i] + gupxy[i]*gyyx[i] + gupxz[i]*gyzx[i]) +
|
lg_xy * (lg_xx*gxyx[i] + lg_xy*gyyx[i] + lg_xz*gyzx[i]) +
|
||||||
gupxz[i] * (gupxx[i]*gxzx[i] + gupxy[i]*gyzx[i] + gupxz[i]*gzzx[i]) +
|
lg_xz * (lg_xx*gxzx[i] + lg_xy*gyzx[i] + lg_xz*gzzx[i]) +
|
||||||
|
lg_xx * (lg_xy*gxxy[i] + lg_yy*gxyy[i] + lg_yz*gxzy[i]) +
|
||||||
gupxx[i] * (gupxy[i]*gxxy[i] + gupyy[i]*gxyy[i] + gupyz[i]*gxzy[i]) +
|
lg_xy * (lg_xy*gxyy[i] + lg_yy*gyyy[i] + lg_yz*gyzy[i]) +
|
||||||
gupxy[i] * (gupxy[i]*gxyy[i] + gupyy[i]*gyyy[i] + gupyz[i]*gyzy[i]) +
|
lg_xz * (lg_xy*gxzy[i] + lg_yy*gyzy[i] + lg_yz*gzzy[i]) +
|
||||||
gupxz[i] * (gupxy[i]*gxzy[i] + gupyy[i]*gyzy[i] + gupyz[i]*gzzy[i]) +
|
lg_xx * (lg_xz*gxxz[i] + lg_yz*gxyz[i] + lg_zz*gxzz[i]) +
|
||||||
|
lg_xy * (lg_xz*gxyz[i] + lg_yz*gyyz[i] + lg_zz*gyzz[i]) +
|
||||||
gupxx[i] * (gupxz[i]*gxxz[i] + gupyz[i]*gxyz[i] + gupzz[i]*gxzz[i]) +
|
lg_xz * (lg_xz*gxzz[i] + lg_yz*gyzz[i] + lg_zz*gzzz[i])
|
||||||
gupxy[i] * (gupxz[i]*gxyz[i] + gupyz[i]*gyyz[i] + gupzz[i]*gyzz[i]) +
|
|
||||||
gupxz[i] * (gupxz[i]*gxzz[i] + gupyz[i]*gyzz[i] + gupzz[i]*gzzz[i])
|
|
||||||
);
|
);
|
||||||
|
|
||||||
Gmy_Res[i] = Gamy[i] - (
|
Gmy_Res[i] = Gamy[i] - (
|
||||||
gupxx[i] * (gupxy[i]*gxxx[i] + gupyy[i]*gxyx[i] + gupyz[i]*gxzx[i]) +
|
lg_xx * (lg_xy*gxxx[i] + lg_yy*gxyx[i] + lg_yz*gxzx[i]) +
|
||||||
gupxy[i] * (gupxy[i]*gxyx[i] + gupyy[i]*gyyx[i] + gupyz[i]*gyzx[i]) +
|
lg_xy * (lg_xy*gxyx[i] + lg_yy*gyyx[i] + lg_yz*gyzx[i]) +
|
||||||
gupxz[i] * (gupxy[i]*gxzx[i] + gupyy[i]*gyzx[i] + gupyz[i]*gzzx[i]) +
|
lg_xz * (lg_xy*gxzx[i] + lg_yy*gyzx[i] + lg_yz*gzzx[i]) +
|
||||||
|
lg_xy * (lg_xy*gxxy[i] + lg_yy*gxyy[i] + lg_yz*gxzy[i]) +
|
||||||
gupxy[i] * (gupxy[i]*gxxy[i] + gupyy[i]*gxyy[i] + gupyz[i]*gxzy[i]) +
|
lg_yy * (lg_xy*gxyy[i] + lg_yy*gyyy[i] + lg_yz*gyzy[i]) +
|
||||||
gupyy[i] * (gupxy[i]*gxyy[i] + gupyy[i]*gyyy[i] + gupyz[i]*gyzy[i]) +
|
lg_yz * (lg_xy*gxzy[i] + lg_yy*gyzy[i] + lg_yz*gzzy[i]) +
|
||||||
gupyz[i] * (gupxy[i]*gxzy[i] + gupyy[i]*gyzy[i] + gupyz[i]*gzzy[i]) +
|
lg_xy * (lg_xz*gxxz[i] + lg_yz*gxyz[i] + lg_zz*gxzz[i]) +
|
||||||
|
lg_yy * (lg_xz*gxyz[i] + lg_yz*gyyz[i] + lg_zz*gyzz[i]) +
|
||||||
gupxy[i] * (gupxz[i]*gxxz[i] + gupyz[i]*gxyz[i] + gupzz[i]*gxzz[i]) +
|
lg_yz * (lg_xz*gxzz[i] + lg_yz*gyzz[i] + lg_zz*gzzz[i])
|
||||||
gupyy[i] * (gupxz[i]*gxyz[i] + gupyz[i]*gyyz[i] + gupzz[i]*gyzz[i]) +
|
|
||||||
gupyz[i] * (gupxz[i]*gxzz[i] + gupyz[i]*gyzz[i] + gupzz[i]*gzzz[i])
|
|
||||||
);
|
);
|
||||||
|
|
||||||
Gmz_Res[i] = Gamz[i] - (
|
Gmz_Res[i] = Gamz[i] - (
|
||||||
gupxx[i] * (gupxz[i]*gxxx[i] + gupyz[i]*gxyx[i] + gupzz[i]*gxzx[i]) +
|
lg_xx * (lg_xz*gxxx[i] + lg_yz*gxyx[i] + lg_zz*gxzx[i]) +
|
||||||
gupxy[i] * (gupxz[i]*gxyx[i] + gupyz[i]*gyyx[i] + gupzz[i]*gyzx[i]) +
|
lg_xy * (lg_xz*gxyx[i] + lg_yz*gyyx[i] + lg_zz*gyzx[i]) +
|
||||||
gupxz[i] * (gupxz[i]*gxzx[i] + gupyz[i]*gyzx[i] + gupzz[i]*gzzx[i]) +
|
lg_xz * (lg_xz*gxzx[i] + lg_yz*gyzx[i] + lg_zz*gzzx[i]) +
|
||||||
|
lg_xy * (lg_xz*gxxy[i] + lg_yz*gxyy[i] + lg_zz*gxzy[i]) +
|
||||||
gupxy[i] * (gupxz[i]*gxxy[i] + gupyz[i]*gxyy[i] + gupzz[i]*gxzy[i]) +
|
lg_yy * (lg_xz*gxyy[i] + lg_yz*gyyy[i] + lg_zz*gyzy[i]) +
|
||||||
gupyy[i] * (gupxz[i]*gxyy[i] + gupyz[i]*gyyy[i] + gupzz[i]*gyzy[i]) +
|
lg_yz * (lg_xz*gxzy[i] + lg_yz*gyzy[i] + lg_zz*gzzy[i]) +
|
||||||
gupyz[i] * (gupxz[i]*gxzy[i] + gupyz[i]*gyzy[i] + gupzz[i]*gzzy[i]) +
|
lg_xz * (lg_xz*gxxz[i] + lg_yz*gxyz[i] + lg_zz*gxzz[i]) +
|
||||||
|
lg_yz * (lg_xz*gxyz[i] + lg_yz*gyyz[i] + lg_zz*gyzz[i]) +
|
||||||
gupxz[i] * (gupxz[i]*gxxz[i] + gupyz[i]*gxyz[i] + gupzz[i]*gxzz[i]) +
|
lg_zz * (lg_xz*gxzz[i] + lg_yz*gyzz[i] + lg_zz*gzzz[i])
|
||||||
gupyz[i] * (gupxz[i]*gxyz[i] + gupyz[i]*gyyz[i] + gupzz[i]*gyzz[i]) +
|
|
||||||
gupzz[i] * (gupxz[i]*gxzz[i] + gupyz[i]*gyzz[i] + gupzz[i]*gzzz[i])
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Gamxxx[i] = HALF * ( lg_xx*gxxx[i]
|
||||||
|
+ lg_xy*(TWO*gxyx[i] - gxxy[i])
|
||||||
|
+ lg_xz*(TWO*gxzx[i] - gxxz[i]) );
|
||||||
|
Gamyxx[i] = HALF * ( lg_xy*gxxx[i]
|
||||||
|
+ lg_yy*(TWO*gxyx[i] - gxxy[i])
|
||||||
|
+ lg_yz*(TWO*gxzx[i] - gxxz[i]) );
|
||||||
|
Gamzxx[i] = HALF * ( lg_xz*gxxx[i]
|
||||||
|
+ lg_yz*(TWO*gxyx[i] - gxxy[i])
|
||||||
|
+ lg_zz*(TWO*gxzx[i] - gxxz[i]) );
|
||||||
|
Gamxyy[i] = HALF * ( lg_xx*(TWO*gxyy[i] - gyyx[i])
|
||||||
|
+ lg_xy*gyyy[i]
|
||||||
|
+ lg_xz*(TWO*gyzy[i] - gyyz[i]) );
|
||||||
|
Gamyyy[i] = HALF * ( lg_xy*(TWO*gxyy[i] - gyyx[i])
|
||||||
|
+ lg_yy*gyyy[i]
|
||||||
|
+ lg_yz*(TWO*gyzy[i] - gyyz[i]) );
|
||||||
|
Gamzyy[i] = HALF * ( lg_xz*(TWO*gxyy[i] - gyyx[i])
|
||||||
|
+ lg_yz*gyyy[i]
|
||||||
|
+ lg_zz*(TWO*gyzy[i] - gyyz[i]) );
|
||||||
|
Gamxzz[i] = HALF * ( lg_xx*(TWO*gxzz[i] - gzzx[i])
|
||||||
|
+ lg_xy*(TWO*gyzz[i] - gzzy[i])
|
||||||
|
+ lg_xz*gzzz[i] );
|
||||||
|
Gamyzz[i] = HALF * ( lg_xy*(TWO*gxzz[i] - gzzx[i])
|
||||||
|
+ lg_yy*(TWO*gyzz[i] - gzzy[i])
|
||||||
|
+ lg_yz*gzzz[i] );
|
||||||
|
Gamzzz[i] = HALF * ( lg_xz*(TWO*gxzz[i] - gzzx[i])
|
||||||
|
+ lg_yz*(TWO*gyzz[i] - gzzy[i])
|
||||||
|
+ lg_zz*gzzz[i] );
|
||||||
|
Gamxxy[i] = HALF * ( lg_xx*gxxy[i]
|
||||||
|
+ lg_xy*gyyx[i]
|
||||||
|
+ lg_xz*(gxzy[i] + gyzx[i] - gxyz[i]) );
|
||||||
|
Gamyxy[i] = HALF * ( lg_xy*gxxy[i]
|
||||||
|
+ lg_yy*gyyx[i]
|
||||||
|
+ lg_yz*(gxzy[i] + gyzx[i] - gxyz[i]) );
|
||||||
|
Gamzxy[i] = HALF * ( lg_xz*gxxy[i]
|
||||||
|
+ lg_yz*gyyx[i]
|
||||||
|
+ lg_zz*(gxzy[i] + gyzx[i] - gxyz[i]) );
|
||||||
|
Gamxxz[i] = HALF * ( lg_xx*gxxz[i]
|
||||||
|
+ lg_xy*(gxyz[i] + gyzx[i] - gxzy[i])
|
||||||
|
+ lg_xz*gzzx[i] );
|
||||||
|
Gamyxz[i] = HALF * ( lg_xy*gxxz[i]
|
||||||
|
+ lg_yy*(gxyz[i] + gyzx[i] - gxzy[i])
|
||||||
|
+ lg_yz*gzzx[i] );
|
||||||
|
Gamzxz[i] = HALF * ( lg_xz*gxxz[i]
|
||||||
|
+ lg_yz*(gxyz[i] + gyzx[i] - gxzy[i])
|
||||||
|
+ lg_zz*gzzx[i] );
|
||||||
|
Gamxyz[i] = HALF * ( lg_xx*(gxyz[i] + gxzy[i] - gyzx[i])
|
||||||
|
+ lg_xy*gyyz[i]
|
||||||
|
+ lg_xz*gzzy[i] );
|
||||||
|
Gamyyz[i] = HALF * ( lg_xy*(gxyz[i] + gxzy[i] - gyzx[i])
|
||||||
|
+ lg_yy*gyyz[i]
|
||||||
|
+ lg_yz*gzzy[i] );
|
||||||
|
Gamzyz[i] = HALF * ( lg_xz*(gxyz[i] + gxzy[i] - gyzx[i])
|
||||||
|
+ lg_yz*gyyz[i]
|
||||||
|
+ lg_zz*gzzy[i] );
|
||||||
}
|
}
|
||||||
// 5ms //
|
// Fused: A^{ij} raise-index + Gamma_rhs part 1 (2 loops -> 1)
|
||||||
for (int i=0;i<all;i+=1) {
|
for (int i=0;i<all;i+=1) {
|
||||||
|
double axx = gupxx[i]*gupxx[i]*Axx[i]
|
||||||
Gamxxx[i] = HALF * ( gupxx[i]*gxxx[i]
|
|
||||||
+ gupxy[i]*(TWO*gxyx[i] - gxxy[i])
|
|
||||||
+ gupxz[i]*(TWO*gxzx[i] - gxxz[i]) );
|
|
||||||
|
|
||||||
Gamyxx[i] = HALF * ( gupxy[i]*gxxx[i]
|
|
||||||
+ gupyy[i]*(TWO*gxyx[i] - gxxy[i])
|
|
||||||
+ gupyz[i]*(TWO*gxzx[i] - gxxz[i]) );
|
|
||||||
|
|
||||||
Gamzxx[i] = HALF * ( gupxz[i]*gxxx[i]
|
|
||||||
+ gupyz[i]*(TWO*gxyx[i] - gxxy[i])
|
|
||||||
+ gupzz[i]*(TWO*gxzx[i] - gxxz[i]) );
|
|
||||||
|
|
||||||
Gamxyy[i] = HALF * ( gupxx[i]*(TWO*gxyy[i] - gyyx[i])
|
|
||||||
+ gupxy[i]*gyyy[i]
|
|
||||||
+ gupxz[i]*(TWO*gyzy[i] - gyyz[i]) );
|
|
||||||
|
|
||||||
Gamyyy[i] = HALF * ( gupxy[i]*(TWO*gxyy[i] - gyyx[i])
|
|
||||||
+ gupyy[i]*gyyy[i]
|
|
||||||
+ gupyz[i]*(TWO*gyzy[i] - gyyz[i]) );
|
|
||||||
|
|
||||||
Gamzyy[i] = HALF * ( gupxz[i]*(TWO*gxyy[i] - gyyx[i])
|
|
||||||
+ gupyz[i]*gyyy[i]
|
|
||||||
+ gupzz[i]*(TWO*gyzy[i] - gyyz[i]) );
|
|
||||||
|
|
||||||
Gamxzz[i] = HALF * ( gupxx[i]*(TWO*gxzz[i] - gzzx[i])
|
|
||||||
+ gupxy[i]*(TWO*gyzz[i] - gzzy[i])
|
|
||||||
+ gupxz[i]*gzzz[i] );
|
|
||||||
|
|
||||||
Gamyzz[i] = HALF * ( gupxy[i]*(TWO*gxzz[i] - gzzx[i])
|
|
||||||
+ gupyy[i]*(TWO*gyzz[i] - gzzy[i])
|
|
||||||
+ gupyz[i]*gzzz[i] );
|
|
||||||
|
|
||||||
Gamzzz[i] = HALF * ( gupxz[i]*(TWO*gxzz[i] - gzzx[i])
|
|
||||||
+ gupyz[i]*(TWO*gyzz[i] - gzzy[i])
|
|
||||||
+ gupzz[i]*gzzz[i] );
|
|
||||||
|
|
||||||
Gamxxy[i] = HALF * ( gupxx[i]*gxxy[i]
|
|
||||||
+ gupxy[i]*gyyx[i]
|
|
||||||
+ gupxz[i]*(gxzy[i] + gyzx[i] - gxyz[i]) );
|
|
||||||
|
|
||||||
Gamyxy[i] = HALF * ( gupxy[i]*gxxy[i]
|
|
||||||
+ gupyy[i]*gyyx[i]
|
|
||||||
+ gupyz[i]*(gxzy[i] + gyzx[i] - gxyz[i]) );
|
|
||||||
|
|
||||||
Gamzxy[i] = HALF * ( gupxz[i]*gxxy[i]
|
|
||||||
+ gupyz[i]*gyyx[i]
|
|
||||||
+ gupzz[i]*(gxzy[i] + gyzx[i] - gxyz[i]) );
|
|
||||||
|
|
||||||
Gamxxz[i] = HALF * ( gupxx[i]*gxxz[i]
|
|
||||||
+ gupxy[i]*(gxyz[i] + gyzx[i] - gxzy[i])
|
|
||||||
+ gupxz[i]*gzzx[i] );
|
|
||||||
|
|
||||||
Gamyxz[i] = HALF * ( gupxy[i]*gxxz[i]
|
|
||||||
+ gupyy[i]*(gxyz[i] + gyzx[i] - gxzy[i])
|
|
||||||
+ gupyz[i]*gzzx[i] );
|
|
||||||
|
|
||||||
Gamzxz[i] = HALF * ( gupxz[i]*gxxz[i]
|
|
||||||
+ gupyz[i]*(gxyz[i] + gyzx[i] - gxzy[i])
|
|
||||||
+ gupzz[i]*gzzx[i] );
|
|
||||||
|
|
||||||
Gamxyz[i] = HALF * ( gupxx[i]*(gxyz[i] + gxzy[i] - gyzx[i])
|
|
||||||
+ gupxy[i]*gyyz[i]
|
|
||||||
+ gupxz[i]*gzzy[i] );
|
|
||||||
|
|
||||||
Gamyyz[i] = HALF * ( gupxy[i]*(gxyz[i] + gxzy[i] - gyzx[i])
|
|
||||||
+ gupyy[i]*gyyz[i]
|
|
||||||
+ gupyz[i]*gzzy[i] );
|
|
||||||
|
|
||||||
Gamzyz[i] = HALF * ( gupxz[i]*(gxyz[i] + gxzy[i] - gyzx[i])
|
|
||||||
+ gupyz[i]*gyyz[i]
|
|
||||||
+ gupzz[i]*gzzy[i] );
|
|
||||||
|
|
||||||
}
|
|
||||||
// 1.8ms //
|
|
||||||
for (int i=0;i<all;i+=1) {
|
|
||||||
|
|
||||||
Rxx[i] = gupxx[i]*gupxx[i]*Axx[i]
|
|
||||||
+ gupxy[i]*gupxy[i]*Ayy[i]
|
+ gupxy[i]*gupxy[i]*Ayy[i]
|
||||||
+ gupxz[i]*gupxz[i]*Azz[i]
|
+ gupxz[i]*gupxz[i]*Azz[i]
|
||||||
+ TWO * ( gupxx[i]*gupxy[i]*Axy[i]
|
+ TWO * ( gupxx[i]*gupxy[i]*Axy[i]
|
||||||
+ gupxx[i]*gupxz[i]*Axz[i]
|
+ gupxx[i]*gupxz[i]*Axz[i]
|
||||||
+ gupxy[i]*gupxz[i]*Ayz[i] );
|
+ gupxy[i]*gupxz[i]*Ayz[i] );
|
||||||
|
double ayy = gupxy[i]*gupxy[i]*Axx[i]
|
||||||
Ryy[i] = gupxy[i]*gupxy[i]*Axx[i]
|
|
||||||
+ gupyy[i]*gupyy[i]*Ayy[i]
|
+ gupyy[i]*gupyy[i]*Ayy[i]
|
||||||
+ gupyz[i]*gupyz[i]*Azz[i]
|
+ gupyz[i]*gupyz[i]*Azz[i]
|
||||||
+ TWO * ( gupxy[i]*gupyy[i]*Axy[i]
|
+ TWO * ( gupxy[i]*gupyy[i]*Axy[i]
|
||||||
+ gupxy[i]*gupyz[i]*Axz[i]
|
+ gupxy[i]*gupyz[i]*Axz[i]
|
||||||
+ gupyy[i]*gupyz[i]*Ayz[i] );
|
+ gupyy[i]*gupyz[i]*Ayz[i] );
|
||||||
|
double azz = gupxz[i]*gupxz[i]*Axx[i]
|
||||||
Rzz[i] = gupxz[i]*gupxz[i]*Axx[i]
|
|
||||||
+ gupyz[i]*gupyz[i]*Ayy[i]
|
+ gupyz[i]*gupyz[i]*Ayy[i]
|
||||||
+ gupzz[i]*gupzz[i]*Azz[i]
|
+ gupzz[i]*gupzz[i]*Azz[i]
|
||||||
+ TWO * ( gupxz[i]*gupyz[i]*Axy[i]
|
+ TWO * ( gupxz[i]*gupyz[i]*Axy[i]
|
||||||
+ gupxz[i]*gupzz[i]*Axz[i]
|
+ gupxz[i]*gupzz[i]*Axz[i]
|
||||||
+ gupyz[i]*gupzz[i]*Ayz[i] );
|
+ gupyz[i]*gupzz[i]*Ayz[i] );
|
||||||
|
double axy = gupxx[i]*gupxy[i]*Axx[i]
|
||||||
Rxy[i] = gupxx[i]*gupxy[i]*Axx[i]
|
|
||||||
+ gupxy[i]*gupyy[i]*Ayy[i]
|
+ gupxy[i]*gupyy[i]*Ayy[i]
|
||||||
+ gupxz[i]*gupyz[i]*Azz[i]
|
+ gupxz[i]*gupyz[i]*Azz[i]
|
||||||
+ ( gupxx[i]*gupyy[i] + gupxy[i]*gupxy[i] ) * Axy[i]
|
+ ( gupxx[i]*gupyy[i] + gupxy[i]*gupxy[i] ) * Axy[i]
|
||||||
+ ( gupxx[i]*gupyz[i] + gupxz[i]*gupxy[i] ) * Axz[i]
|
+ ( gupxx[i]*gupyz[i] + gupxz[i]*gupxy[i] ) * Axz[i]
|
||||||
+ ( gupxy[i]*gupyz[i] + gupxz[i]*gupyy[i] ) * Ayz[i];
|
+ ( gupxy[i]*gupyz[i] + gupxz[i]*gupyy[i] ) * Ayz[i];
|
||||||
|
double axz = gupxx[i]*gupxz[i]*Axx[i]
|
||||||
Rxz[i] = gupxx[i]*gupxz[i]*Axx[i]
|
|
||||||
+ gupxy[i]*gupyz[i]*Ayy[i]
|
+ gupxy[i]*gupyz[i]*Ayy[i]
|
||||||
+ gupxz[i]*gupzz[i]*Azz[i]
|
+ gupxz[i]*gupzz[i]*Azz[i]
|
||||||
+ ( gupxx[i]*gupyz[i] + gupxy[i]*gupxz[i] ) * Axy[i]
|
+ ( gupxx[i]*gupyz[i] + gupxy[i]*gupxz[i] ) * Axy[i]
|
||||||
+ ( gupxx[i]*gupzz[i] + gupxz[i]*gupxz[i] ) * Axz[i]
|
+ ( gupxx[i]*gupzz[i] + gupxz[i]*gupxz[i] ) * Axz[i]
|
||||||
+ ( gupxy[i]*gupzz[i] + gupxz[i]*gupyz[i] ) * Ayz[i];
|
+ ( gupxy[i]*gupzz[i] + gupxz[i]*gupyz[i] ) * Ayz[i];
|
||||||
|
double ayz = gupxy[i]*gupxz[i]*Axx[i]
|
||||||
Ryz[i] = gupxy[i]*gupxz[i]*Axx[i]
|
|
||||||
+ gupyy[i]*gupyz[i]*Ayy[i]
|
+ gupyy[i]*gupyz[i]*Ayy[i]
|
||||||
+ gupyz[i]*gupzz[i]*Azz[i]
|
+ gupyz[i]*gupzz[i]*Azz[i]
|
||||||
+ ( gupxy[i]*gupyz[i] + gupyy[i]*gupxz[i] ) * Axy[i]
|
+ ( gupxy[i]*gupyz[i] + gupyy[i]*gupxz[i] ) * Axy[i]
|
||||||
+ ( gupxy[i]*gupzz[i] + gupyz[i]*gupxz[i] ) * Axz[i]
|
+ ( gupxy[i]*gupzz[i] + gupyz[i]*gupxz[i] ) * Axz[i]
|
||||||
+ ( gupyy[i]*gupzz[i] + gupyz[i]*gupyz[i] ) * Ayz[i];
|
+ ( gupyy[i]*gupzz[i] + gupyz[i]*gupyz[i] ) * Ayz[i];
|
||||||
}
|
Rxx[i] = axx; Ryy[i] = ayy; Rzz[i] = azz;
|
||||||
// 4ms //
|
Rxy[i] = axy; Rxz[i] = axz; Ryz[i] = ayz;
|
||||||
for(int i=0;i<all;i+=1){
|
|
||||||
Gamx_rhs[i] = - TWO * ( Lapx[i] * Rxx[i] + Lapy[i] * Rxy[i] + Lapz[i] * Rxz[i] ) +
|
|
||||||
TWO * alpn1[i] * (
|
|
||||||
-F3o2/chin1[i] * ( chix[i] * Rxx[i] + chiy[i] * Rxy[i] + chiz[i] * Rxz[i] ) -
|
|
||||||
gupxx[i] * ( F2o3 * Kx[i] + EIGHT * PI * Sx[i] ) -
|
|
||||||
gupxy[i] * ( F2o3 * Ky[i] + EIGHT * PI * Sy[i] ) -
|
|
||||||
gupxz[i] * ( F2o3 * Kz[i] + EIGHT * PI * Sz[i] ) +
|
|
||||||
Gamxxx[i] * Rxx[i] + Gamxyy[i] * Ryy[i] + Gamxzz[i] * Rzz[i] +
|
|
||||||
TWO * ( Gamxxy[i] * Rxy[i] + Gamxxz[i] * Rxz[i] + Gamxyz[i] * Ryz[i] ) );
|
|
||||||
|
|
||||||
Gamy_rhs[i] = -TWO * ( Lapx[i]*Rxy[i] + Lapy[i]*Ryy[i] + Lapz[i]*Ryz[i] )
|
Gamx_rhs[i] = - TWO * ( Lapx[i]*axx + Lapy[i]*axy + Lapz[i]*axz ) +
|
||||||
|
TWO * alpn1[i] * (
|
||||||
|
-F3o2/chin1[i] * ( chix[i]*axx + chiy[i]*axy + chiz[i]*axz ) -
|
||||||
|
gupxx[i] * ( F2o3*Kx[i] + EIGHT*PI*Sx[i] ) -
|
||||||
|
gupxy[i] * ( F2o3*Ky[i] + EIGHT*PI*Sy[i] ) -
|
||||||
|
gupxz[i] * ( F2o3*Kz[i] + EIGHT*PI*Sz[i] ) +
|
||||||
|
Gamxxx[i]*axx + Gamxyy[i]*ayy + Gamxzz[i]*azz +
|
||||||
|
TWO * ( Gamxxy[i]*axy + Gamxxz[i]*axz + Gamxyz[i]*ayz ) );
|
||||||
|
|
||||||
|
Gamy_rhs[i] = -TWO * ( Lapx[i]*axy + Lapy[i]*ayy + Lapz[i]*ayz )
|
||||||
+ TWO * alpn1[i] * (
|
+ TWO * alpn1[i] * (
|
||||||
-F3o2/chin1[i] * ( chix[i]*Rxy[i] + chiy[i]*Ryy[i] + chiz[i]*Ryz[i] )
|
-F3o2/chin1[i] * ( chix[i]*axy + chiy[i]*ayy + chiz[i]*ayz )
|
||||||
- gupxy[i] * ( F2o3*Kx[i] + EIGHT*PI*Sx[i] )
|
- gupxy[i] * ( F2o3*Kx[i] + EIGHT*PI*Sx[i] )
|
||||||
- gupyy[i] * ( F2o3*Ky[i] + EIGHT*PI*Sy[i] )
|
- gupyy[i] * ( F2o3*Ky[i] + EIGHT*PI*Sy[i] )
|
||||||
- gupyz[i] * ( F2o3*Kz[i] + EIGHT*PI*Sz[i] )
|
- gupyz[i] * ( F2o3*Kz[i] + EIGHT*PI*Sz[i] )
|
||||||
+ Gamyxx[i]*Rxx[i] + Gamyyy[i]*Ryy[i] + Gamyzz[i]*Rzz[i]
|
+ Gamyxx[i]*axx + Gamyyy[i]*ayy + Gamyzz[i]*azz
|
||||||
+ TWO * ( Gamyxy[i]*Rxy[i] + Gamyxz[i]*Rxz[i] + Gamyyz[i]*Ryz[i] )
|
+ TWO * ( Gamyxy[i]*axy + Gamyxz[i]*axz + Gamyyz[i]*ayz )
|
||||||
);
|
);
|
||||||
|
|
||||||
Gamz_rhs[i] = -TWO * ( Lapx[i]*Rxz[i] + Lapy[i]*Ryz[i] + Lapz[i]*Rzz[i] )
|
Gamz_rhs[i] = -TWO * ( Lapx[i]*axz + Lapy[i]*ayz + Lapz[i]*azz )
|
||||||
+ TWO * alpn1[i] * (
|
+ TWO * alpn1[i] * (
|
||||||
-F3o2/chin1[i] * ( chix[i]*Rxz[i] + chiy[i]*Ryz[i] + chiz[i]*Rzz[i] )
|
-F3o2/chin1[i] * ( chix[i]*axz + chiy[i]*ayz + chiz[i]*azz )
|
||||||
- gupxz[i] * ( F2o3*Kx[i] + EIGHT*PI*Sx[i] )
|
- gupxz[i] * ( F2o3*Kx[i] + EIGHT*PI*Sx[i] )
|
||||||
- gupyz[i] * ( F2o3*Ky[i] + EIGHT*PI*Sy[i] )
|
- gupyz[i] * ( F2o3*Ky[i] + EIGHT*PI*Sy[i] )
|
||||||
- gupzz[i] * ( F2o3*Kz[i] + EIGHT*PI*Sz[i] )
|
- gupzz[i] * ( F2o3*Kz[i] + EIGHT*PI*Sz[i] )
|
||||||
+ Gamzxx[i]*Rxx[i] + Gamzyy[i]*Ryy[i] + Gamzzz[i]*Rzz[i]
|
+ Gamzxx[i]*axx + Gamzyy[i]*ayy + Gamzzz[i]*azz
|
||||||
+ TWO * ( Gamzxy[i]*Rxy[i] + Gamzxz[i]*Rxz[i] + Gamzyz[i]*Ryz[i] )
|
+ TWO * ( Gamzxy[i]*axy + Gamzxz[i]*axz + Gamzyz[i]*ayz )
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
// 22.3ms //
|
// 22.3ms //
|
||||||
@@ -365,65 +326,63 @@ int f_compute_rhs_bssn(int *ex, double &T,
|
|||||||
fderivs(ex,Gamy,Gamyx,Gamyy,Gamyz,X,Y,Z,SYM ,ANTI,SYM ,Symmetry,Lev);
|
fderivs(ex,Gamy,Gamyx,Gamyy,Gamyz,X,Y,Z,SYM ,ANTI,SYM ,Symmetry,Lev);
|
||||||
fderivs(ex,Gamz,Gamzx,Gamzy,Gamzz,X,Y,Z,SYM ,SYM ,ANTI,Symmetry,Lev);
|
fderivs(ex,Gamz,Gamzx,Gamzy,Gamzz,X,Y,Z,SYM ,SYM ,ANTI,Symmetry,Lev);
|
||||||
|
|
||||||
// 3.5ms //
|
// Fused: fxx/Gamxa + Gamma_rhs part 2 (2 loops -> 1)
|
||||||
for(int i=0;i<all;i+=1){
|
for(int i=0;i<all;i+=1){
|
||||||
fxx[i] = gxxx[i] + gxyy[i] + gxzz[i];
|
const double divb = betaxx[i] + betayy[i] + betazz[i];
|
||||||
fxy[i] = gxyx[i] + gyyy[i] + gyzz[i];
|
double lfxx = gxxx[i] + gxyy[i] + gxzz[i];
|
||||||
fxz[i] = gxzx[i] + gyzy[i] + gzzz[i];
|
double lfxy = gxyx[i] + gyyy[i] + gyzz[i];
|
||||||
Gamxa[i] = gupxx[i]*Gamxxx[i] + gupyy[i]*Gamxyy[i] + gupzz[i]*Gamxzz[i]
|
double lfxz = gxzx[i] + gyzy[i] + gzzz[i];
|
||||||
|
fxx[i] = lfxx; fxy[i] = lfxy; fxz[i] = lfxz;
|
||||||
|
|
||||||
|
double gxa = gupxx[i]*Gamxxx[i] + gupyy[i]*Gamxyy[i] + gupzz[i]*Gamxzz[i]
|
||||||
+ TWO * ( gupxy[i]*Gamxxy[i] + gupxz[i]*Gamxxz[i] + gupyz[i]*Gamxyz[i] );
|
+ TWO * ( gupxy[i]*Gamxxy[i] + gupxz[i]*Gamxxz[i] + gupyz[i]*Gamxyz[i] );
|
||||||
|
double gya = gupxx[i]*Gamyxx[i] + gupyy[i]*Gamyyy[i] + gupzz[i]*Gamyzz[i]
|
||||||
Gamya[i] = gupxx[i]*Gamyxx[i] + gupyy[i]*Gamyyy[i] + gupzz[i]*Gamyzz[i]
|
|
||||||
+ TWO * ( gupxy[i]*Gamyxy[i] + gupxz[i]*Gamyxz[i] + gupyz[i]*Gamyyz[i] );
|
+ TWO * ( gupxy[i]*Gamyxy[i] + gupxz[i]*Gamyxz[i] + gupyz[i]*Gamyyz[i] );
|
||||||
|
double gza = gupxx[i]*Gamzxx[i] + gupyy[i]*Gamzyy[i] + gupzz[i]*Gamzzz[i]
|
||||||
Gamza[i] = gupxx[i]*Gamzxx[i] + gupyy[i]*Gamzyy[i] + gupzz[i]*Gamzzz[i]
|
|
||||||
+ TWO * ( gupxy[i]*Gamzxy[i] + gupxz[i]*Gamzxz[i] + gupyz[i]*Gamzyz[i] );
|
+ TWO * ( gupxy[i]*Gamzxy[i] + gupxz[i]*Gamzxz[i] + gupyz[i]*Gamzyz[i] );
|
||||||
}
|
|
||||||
// 3.9ms //
|
|
||||||
for(int i=0;i<all;i+=1){
|
|
||||||
Gamx_rhs[i] = Gamx_rhs[i]
|
Gamx_rhs[i] = Gamx_rhs[i]
|
||||||
+ F2o3 * Gamxa[i] * div_beta[i]
|
+ F2o3 * gxa * divb
|
||||||
- Gamxa[i] * betaxx[i] - Gamya[i] * betaxy[i] - Gamza[i] * betaxz[i]
|
- gxa * betaxx[i] - gya * betaxy[i] - gza * betaxz[i]
|
||||||
+ F1o3 * ( gupxx[i] * fxx[i] + gupxy[i] * fxy[i] + gupxz[i] * fxz[i] )
|
+ F1o3 * ( gupxx[i] * lfxx + gupxy[i] * lfxy + gupxz[i] * lfxz )
|
||||||
+ gupxx[i] * gxxx[i] + gupyy[i] * gyyx[i] + gupzz[i] * gzzx[i]
|
+ gupxx[i] * gxxx[i] + gupyy[i] * gyyx[i] + gupzz[i] * gzzx[i]
|
||||||
+ TWO * ( gupxy[i] * gxyx[i] + gupxz[i] * gxzx[i] + gupyz[i] * gyzx[i] );
|
+ TWO * ( gupxy[i] * gxyx[i] + gupxz[i] * gxzx[i] + gupyz[i] * gyzx[i] );
|
||||||
|
|
||||||
Gamy_rhs[i] = Gamy_rhs[i]
|
Gamy_rhs[i] = Gamy_rhs[i]
|
||||||
+ F2o3 * Gamya[i] * div_beta[i]
|
+ F2o3 * gya * divb
|
||||||
- Gamxa[i] * betayx[i] - Gamya[i] * betayy[i] - Gamza[i] * betayz[i]
|
- gxa * betayx[i] - gya * betayy[i] - gza * betayz[i]
|
||||||
+ F1o3 * ( gupxy[i] * fxx[i] + gupyy[i] * fxy[i] + gupyz[i] * fxz[i] )
|
+ F1o3 * ( gupxy[i] * lfxx + gupyy[i] * lfxy + gupyz[i] * lfxz )
|
||||||
+ gupxx[i] * gxxy[i] + gupyy[i] * gyyy[i] + gupzz[i] * gzzy[i]
|
+ gupxx[i] * gxxy[i] + gupyy[i] * gyyy[i] + gupzz[i] * gzzy[i]
|
||||||
+ TWO * ( gupxy[i] * gxyy[i] + gupxz[i] * gxzy[i] + gupyz[i] * gyzy[i] );
|
+ TWO * ( gupxy[i] * gxyy[i] + gupxz[i] * gxzy[i] + gupyz[i] * gyzy[i] );
|
||||||
|
|
||||||
Gamz_rhs[i] = Gamz_rhs[i]
|
Gamz_rhs[i] = Gamz_rhs[i]
|
||||||
+ F2o3 * Gamza[i] * div_beta[i]
|
+ F2o3 * gza * divb
|
||||||
- Gamxa[i] * betazx[i] - Gamya[i] * betazy[i] - Gamza[i] * betazz[i]
|
- gxa * betazx[i] - gya * betazy[i] - gza * betazz[i]
|
||||||
+ F1o3 * ( gupxz[i] * fxx[i] + gupyz[i] * fxy[i] + gupzz[i] * fxz[i] )
|
+ F1o3 * ( gupxz[i] * lfxx + gupyz[i] * lfxy + gupzz[i] * lfxz )
|
||||||
+ gupxx[i] * gxxz[i] + gupyy[i] * gyyz[i] + gupzz[i] * gzzz[i]
|
+ gupxx[i] * gxxz[i] + gupyy[i] * gyyz[i] + gupzz[i] * gzzz[i]
|
||||||
+ TWO * ( gupxy[i] * gxyz[i] + gupxz[i] * gxzz[i] + gupyz[i] * gyzz[i] );
|
+ TWO * ( gupxy[i] * gxyz[i] + gupxz[i] * gxzz[i] + gupyz[i] * gyzz[i] );
|
||||||
}
|
}
|
||||||
// 4.4ms //
|
// 4.4ms //
|
||||||
for (int i=0;i<all;i+=1) {
|
for (int i=0;i<all;i+=1) {
|
||||||
gxxx[i] = gxx[i]*Gamxxx[i] + gxy[i]*Gamyxx[i] + gxz[i]*Gamzxx[i];
|
gxxx[i] = (dxx[i] + ONE)*Gamxxx[i] + gxy[i]*Gamyxx[i] + gxz[i]*Gamzxx[i];
|
||||||
gxyx[i] = gxx[i]*Gamxxy[i] + gxy[i]*Gamyxy[i] + gxz[i]*Gamzxy[i];
|
gxyx[i] = (dxx[i] + ONE)*Gamxxy[i] + gxy[i]*Gamyxy[i] + gxz[i]*Gamzxy[i];
|
||||||
gxzx[i] = gxx[i]*Gamxxz[i] + gxy[i]*Gamyxz[i] + gxz[i]*Gamzxz[i];
|
gxzx[i] = (dxx[i] + ONE)*Gamxxz[i] + gxy[i]*Gamyxz[i] + gxz[i]*Gamzxz[i];
|
||||||
gyyx[i] = gxx[i]*Gamxyy[i] + gxy[i]*Gamyyy[i] + gxz[i]*Gamzyy[i];
|
gyyx[i] = (dxx[i] + ONE)*Gamxyy[i] + gxy[i]*Gamyyy[i] + gxz[i]*Gamzyy[i];
|
||||||
gyzx[i] = gxx[i]*Gamxyz[i] + gxy[i]*Gamyyz[i] + gxz[i]*Gamzyz[i];
|
gyzx[i] = (dxx[i] + ONE)*Gamxyz[i] + gxy[i]*Gamyyz[i] + gxz[i]*Gamzyz[i];
|
||||||
gzzx[i] = gxx[i]*Gamxzz[i] + gxy[i]*Gamyzz[i] + gxz[i]*Gamzzz[i];
|
gzzx[i] = (dxx[i] + ONE)*Gamxzz[i] + gxy[i]*Gamyzz[i] + gxz[i]*Gamzzz[i];
|
||||||
|
|
||||||
gxxy[i] = gxy[i]*Gamxxx[i] + gyy[i]*Gamyxx[i] + gyz[i]*Gamzxx[i];
|
gxxy[i] = gxy[i]*Gamxxx[i] + (dyy[i] + ONE)*Gamyxx[i] + gyz[i]*Gamzxx[i];
|
||||||
gxyy[i] = gxy[i]*Gamxxy[i] + gyy[i]*Gamyxy[i] + gyz[i]*Gamzxy[i];
|
gxyy[i] = gxy[i]*Gamxxy[i] + (dyy[i] + ONE)*Gamyxy[i] + gyz[i]*Gamzxy[i];
|
||||||
gxzy[i] = gxy[i]*Gamxxz[i] + gyy[i]*Gamyxz[i] + gyz[i]*Gamzxz[i];
|
gxzy[i] = gxy[i]*Gamxxz[i] + (dyy[i] + ONE)*Gamyxz[i] + gyz[i]*Gamzxz[i];
|
||||||
gyyy[i] = gxy[i]*Gamxyy[i] + gyy[i]*Gamyyy[i] + gyz[i]*Gamzyy[i];
|
gyyy[i] = gxy[i]*Gamxyy[i] + (dyy[i] + ONE)*Gamyyy[i] + gyz[i]*Gamzyy[i];
|
||||||
gyzy[i] = gxy[i]*Gamxyz[i] + gyy[i]*Gamyyz[i] + gyz[i]*Gamzyz[i];
|
gyzy[i] = gxy[i]*Gamxyz[i] + (dyy[i] + ONE)*Gamyyz[i] + gyz[i]*Gamzyz[i];
|
||||||
gzzy[i] = gxy[i]*Gamxzz[i] + gyy[i]*Gamyzz[i] + gyz[i]*Gamzzz[i];
|
gzzy[i] = gxy[i]*Gamxzz[i] + (dyy[i] + ONE)*Gamyzz[i] + gyz[i]*Gamzzz[i];
|
||||||
|
|
||||||
gxxz[i] = gxz[i]*Gamxxx[i] + gyz[i]*Gamyxx[i] + gzz[i]*Gamzxx[i];
|
gxxz[i] = gxz[i]*Gamxxx[i] + gyz[i]*Gamyxx[i] + (dzz[i] + ONE)*Gamzxx[i];
|
||||||
gxyz[i] = gxz[i]*Gamxxy[i] + gyz[i]*Gamyxy[i] + gzz[i]*Gamzxy[i];
|
gxyz[i] = gxz[i]*Gamxxy[i] + gyz[i]*Gamyxy[i] + (dzz[i] + ONE)*Gamzxy[i];
|
||||||
gxzz[i] = gxz[i]*Gamxxz[i] + gyz[i]*Gamyxz[i] + gzz[i]*Gamzxz[i];
|
gxzz[i] = gxz[i]*Gamxxz[i] + gyz[i]*Gamyxz[i] + (dzz[i] + ONE)*Gamzxz[i];
|
||||||
gyyz[i] = gxz[i]*Gamxyy[i] + gyz[i]*Gamyyy[i] + gzz[i]*Gamzyy[i];
|
gyyz[i] = gxz[i]*Gamxyy[i] + gyz[i]*Gamyyy[i] + (dzz[i] + ONE)*Gamzyy[i];
|
||||||
gyzz[i] = gxz[i]*Gamxyz[i] + gyz[i]*Gamyyz[i] + gzz[i]*Gamzyz[i];
|
gyzz[i] = gxz[i]*Gamxyz[i] + gyz[i]*Gamyyz[i] + (dzz[i] + ONE)*Gamzyz[i];
|
||||||
gzzz[i] = gxz[i]*Gamxzz[i] + gyz[i]*Gamyzz[i] + gzz[i]*Gamzzz[i];
|
gzzz[i] = gxz[i]*Gamxzz[i] + gyz[i]*Gamyzz[i] + (dzz[i] + ONE)*Gamzzz[i];
|
||||||
}
|
}
|
||||||
// 22.2ms //
|
// 22.2ms //
|
||||||
fdderivs(ex,dxx,fxx,fxy,fxz,fyy,fyz,fzz,X,Y,Z,SYM ,SYM ,SYM ,Symmetry,Lev);
|
fdderivs(ex,dxx,fxx,fxy,fxz,fyy,fyz,fzz,X,Y,Z,SYM ,SYM ,SYM ,Symmetry,Lev);
|
||||||
@@ -471,10 +430,17 @@ int f_compute_rhs_bssn(int *ex, double &T,
|
|||||||
// 14ms //
|
// 14ms //
|
||||||
/* 假设 all = ex1*ex2*ex3,所有量都是 length=all 的 double 数组(已按同一扁平化规则排布) */
|
/* 假设 all = ex1*ex2*ex3,所有量都是 length=all 的 double 数组(已按同一扁平化规则排布) */
|
||||||
for (int i = 0; i < all; i += 1) {
|
for (int i = 0; i < all; i += 1) {
|
||||||
|
const double gxa = gupxx[i]*Gamxxx[i] + gupyy[i]*Gamxyy[i] + gupzz[i]*Gamxzz[i]
|
||||||
|
+ TWO * ( gupxy[i]*Gamxxy[i] + gupxz[i]*Gamxxz[i] + gupyz[i]*Gamxyz[i] );
|
||||||
|
const double gya = gupxx[i]*Gamyxx[i] + gupyy[i]*Gamyyy[i] + gupzz[i]*Gamyzz[i]
|
||||||
|
+ TWO * ( gupxy[i]*Gamyxy[i] + gupxz[i]*Gamyxz[i] + gupyz[i]*Gamyyz[i] );
|
||||||
|
const double gza = gupxx[i]*Gamzxx[i] + gupyy[i]*Gamzyy[i] + gupzz[i]*Gamzzz[i]
|
||||||
|
+ TWO * ( gupxy[i]*Gamzxy[i] + gupxz[i]*Gamzxz[i] + gupyz[i]*Gamzyz[i] );
|
||||||
|
|
||||||
Rxx[i] =
|
Rxx[i] =
|
||||||
-HALF * Rxx[i]
|
-HALF * Rxx[i]
|
||||||
+ gxx[i] * Gamxx[i] + gxy[i] * Gamyx[i] + gxz[i] * Gamzx[i]
|
+ (dxx[i] + ONE) * Gamxx[i] + gxy[i] * Gamyx[i] + gxz[i] * Gamzx[i]
|
||||||
+ Gamxa[i] * gxxx[i] + Gamya[i] * gxyx[i] + Gamza[i] * gxzx[i]
|
+ gxa * gxxx[i] + gya * gxyx[i] + gza * gxzx[i]
|
||||||
+ gupxx[i] * (
|
+ gupxx[i] * (
|
||||||
TWO * (Gamxxx[i] * gxxx[i] + Gamyxx[i] * gxyx[i] + Gamzxx[i] * gxzx[i]) +
|
TWO * (Gamxxx[i] * gxxx[i] + Gamyxx[i] * gxyx[i] + Gamzxx[i] * gxzx[i]) +
|
||||||
(Gamxxx[i] * gxxx[i] + Gamyxx[i] * gxxy[i] + Gamzxx[i] * gxxz[i])
|
(Gamxxx[i] * gxxx[i] + Gamyxx[i] * gxxy[i] + Gamzxx[i] * gxxz[i])
|
||||||
@@ -508,8 +474,8 @@ int f_compute_rhs_bssn(int *ex, double &T,
|
|||||||
|
|
||||||
Ryy[i] =
|
Ryy[i] =
|
||||||
-HALF * Ryy[i]
|
-HALF * Ryy[i]
|
||||||
+ gxy[i] * Gamxy[i] + gyy[i] * Gamyy[i] + gyz[i] * Gamzy[i]
|
+ gxy[i] * Gamxy[i] + (dyy[i] + ONE) * Gamyy[i] + gyz[i] * Gamzy[i]
|
||||||
+ Gamxa[i] * gxyy[i] + Gamya[i] * gyyy[i] + Gamza[i] * gyzy[i]
|
+ gxa * gxyy[i] + gya * gyyy[i] + gza * gyzy[i]
|
||||||
+ gupxx[i] * (
|
+ gupxx[i] * (
|
||||||
TWO * (Gamxxy[i] * gxxy[i] + Gamyxy[i] * gxyy[i] + Gamzxy[i] * gxzy[i]) +
|
TWO * (Gamxxy[i] * gxxy[i] + Gamyxy[i] * gxyy[i] + Gamzxy[i] * gxzy[i]) +
|
||||||
(Gamxxy[i] * gxyx[i] + Gamyxy[i] * gxyy[i] + Gamzxy[i] * gxyz[i])
|
(Gamxxy[i] * gxyx[i] + Gamyxy[i] * gxyy[i] + Gamzxy[i] * gxyz[i])
|
||||||
@@ -543,8 +509,8 @@ int f_compute_rhs_bssn(int *ex, double &T,
|
|||||||
|
|
||||||
Rzz[i] =
|
Rzz[i] =
|
||||||
-HALF * Rzz[i]
|
-HALF * Rzz[i]
|
||||||
+ gxz[i] * Gamxz[i] + gyz[i] * Gamyz[i] + gzz[i] * Gamzz[i]
|
+ gxz[i] * Gamxz[i] + gyz[i] * Gamyz[i] + (dzz[i] + ONE) * Gamzz[i]
|
||||||
+ Gamxa[i] * gxzz[i] + Gamya[i] * gyzz[i] + Gamza[i] * gzzz[i]
|
+ gxa * gxzz[i] + gya * gyzz[i] + gza * gzzz[i]
|
||||||
+ gupxx[i] * (
|
+ gupxx[i] * (
|
||||||
TWO * (Gamxxz[i] * gxxz[i] + Gamyxz[i] * gxyz[i] + Gamzxz[i] * gxzz[i]) +
|
TWO * (Gamxxz[i] * gxxz[i] + Gamyxz[i] * gxyz[i] + Gamzxz[i] * gxzz[i]) +
|
||||||
(Gamxxz[i] * gxzx[i] + Gamyxz[i] * gxzy[i] + Gamzxz[i] * gxzz[i])
|
(Gamxxz[i] * gxzx[i] + Gamyxz[i] * gxzy[i] + Gamzxz[i] * gxzz[i])
|
||||||
@@ -579,10 +545,10 @@ int f_compute_rhs_bssn(int *ex, double &T,
|
|||||||
Rxy[i] =
|
Rxy[i] =
|
||||||
HALF * (
|
HALF * (
|
||||||
-Rxy[i]
|
-Rxy[i]
|
||||||
+ gxx[i] * Gamxy[i] + gxy[i] * Gamyy[i] + gxz[i] * Gamzy[i]
|
+ (dxx[i] + ONE) * Gamxy[i] + gxy[i] * Gamyy[i] + gxz[i] * Gamzy[i]
|
||||||
+ gxy[i] * Gamxx[i] + gyy[i] * Gamyx[i] + gyz[i] * Gamzx[i]
|
+ gxy[i] * Gamxx[i] + (dyy[i] + ONE) * Gamyx[i] + gyz[i] * Gamzx[i]
|
||||||
+ Gamxa[i] * gxyx[i] + Gamya[i] * gyyx[i] + Gamza[i] * gyzx[i]
|
+ gxa * gxyx[i] + gya * gyyx[i] + gza * gyzx[i]
|
||||||
+ Gamxa[i] * gxxy[i] + Gamya[i] * gxyy[i] + Gamza[i] * gxzy[i]
|
+ gxa * gxxy[i] + gya * gxyy[i] + gza * gxzy[i]
|
||||||
)
|
)
|
||||||
+ gupxx[i] * (
|
+ gupxx[i] * (
|
||||||
Gamxxx[i] * gxxy[i] + Gamyxx[i] * gxyy[i] + Gamzxx[i] * gxzy[i]
|
Gamxxx[i] * gxxy[i] + Gamyxx[i] * gxyy[i] + Gamzxx[i] * gxzy[i]
|
||||||
@@ -627,10 +593,10 @@ int f_compute_rhs_bssn(int *ex, double &T,
|
|||||||
Rxz[i] =
|
Rxz[i] =
|
||||||
HALF * (
|
HALF * (
|
||||||
-Rxz[i]
|
-Rxz[i]
|
||||||
+ gxx[i] * Gamxz[i] + gxy[i] * Gamyz[i] + gxz[i] * Gamzz[i]
|
+ (dxx[i] + ONE) * Gamxz[i] + gxy[i] * Gamyz[i] + gxz[i] * Gamzz[i]
|
||||||
+ gxz[i] * Gamxx[i] + gyz[i] * Gamyx[i] + gzz[i] * Gamzx[i]
|
+ gxz[i] * Gamxx[i] + gyz[i] * Gamyx[i] + (dzz[i] + ONE) * Gamzx[i]
|
||||||
+ Gamxa[i] * gxzx[i] + Gamya[i] * gyzx[i] + Gamza[i] * gzzx[i]
|
+ gxa * gxzx[i] + gya * gyzx[i] + gza * gzzx[i]
|
||||||
+ Gamxa[i] * gxxz[i] + Gamya[i] * gxyz[i] + Gamza[i] * gxzz[i]
|
+ gxa * gxxz[i] + gya * gxyz[i] + gza * gxzz[i]
|
||||||
)
|
)
|
||||||
+ gupxx[i] * (
|
+ gupxx[i] * (
|
||||||
Gamxxx[i] * gxxz[i] + Gamyxx[i] * gxyz[i] + Gamzxx[i] * gxzz[i]
|
Gamxxx[i] * gxxz[i] + Gamyxx[i] * gxyz[i] + Gamzxx[i] * gxzz[i]
|
||||||
@@ -675,10 +641,10 @@ int f_compute_rhs_bssn(int *ex, double &T,
|
|||||||
Ryz[i] =
|
Ryz[i] =
|
||||||
HALF * (
|
HALF * (
|
||||||
-Ryz[i]
|
-Ryz[i]
|
||||||
+ gxy[i] * Gamxz[i] + gyy[i] * Gamyz[i] + gyz[i] * Gamzz[i]
|
+ gxy[i] * Gamxz[i] + (dyy[i] + ONE) * Gamyz[i] + gyz[i] * Gamzz[i]
|
||||||
+ gxz[i] * Gamxy[i] + gyz[i] * Gamyy[i] + gzz[i] * Gamzy[i]
|
+ gxz[i] * Gamxy[i] + gyz[i] * Gamyy[i] + (dzz[i] + ONE) * Gamzy[i]
|
||||||
+ Gamxa[i] * gxzy[i] + Gamya[i] * gyzy[i] + Gamza[i] * gzzy[i]
|
+ gxa * gxzy[i] + gya * gyzy[i] + gza * gzzy[i]
|
||||||
+ Gamxa[i] * gxyz[i] + Gamya[i] * gyyz[i] + Gamza[i] * gyzz[i]
|
+ gxa * gxyz[i] + gya * gyyz[i] + gza * gyzz[i]
|
||||||
)
|
)
|
||||||
+ gupxx[i] * (
|
+ gupxx[i] * (
|
||||||
Gamxxy[i] * gxxz[i] + Gamyxy[i] * gxyz[i] + Gamzxy[i] * gxzz[i]
|
Gamxxy[i] * gxxz[i] + Gamyxy[i] * gxyz[i] + Gamzxy[i] * gxzz[i]
|
||||||
@@ -739,9 +705,9 @@ int f_compute_rhs_bssn(int *ex, double &T,
|
|||||||
+ TWO * gupxy[i] * (fxy[i] - (F3o2 / chin1[i]) * chix[i] * chiy[i])
|
+ TWO * gupxy[i] * (fxy[i] - (F3o2 / chin1[i]) * chix[i] * chiy[i])
|
||||||
+ TWO * gupxz[i] * (fxz[i] - (F3o2 / chin1[i]) * chix[i] * chiz[i])
|
+ TWO * gupxz[i] * (fxz[i] - (F3o2 / chin1[i]) * chix[i] * chiz[i])
|
||||||
+ TWO * gupyz[i] * (fyz[i] - (F3o2 / chin1[i]) * chiy[i] * chiz[i]);
|
+ TWO * gupyz[i] * (fyz[i] - (F3o2 / chin1[i]) * chiy[i] * chiz[i]);
|
||||||
Rxx[i] = Rxx[i] + ( fxx[i] - (chix[i] * chix[i]) / (chin1[i] * TWO) + gxx[i] * f[i] ) / (chin1[i] * TWO);
|
Rxx[i] = Rxx[i] + ( fxx[i] - (chix[i] * chix[i]) / (chin1[i] * TWO) + (dxx[i] + ONE) * f[i] ) / (chin1[i] * TWO);
|
||||||
Ryy[i] = Ryy[i] + ( fyy[i] - (chiy[i] * chiy[i]) / (chin1[i] * TWO) + gyy[i] * f[i] ) / (chin1[i] * TWO);
|
Ryy[i] = Ryy[i] + ( fyy[i] - (chiy[i] * chiy[i]) / (chin1[i] * TWO) + (dyy[i] + ONE) * f[i] ) / (chin1[i] * TWO);
|
||||||
Rzz[i] = Rzz[i] + ( fzz[i] - (chiz[i] * chiz[i]) / (chin1[i] * TWO) + gzz[i] * f[i] ) / (chin1[i] * TWO);
|
Rzz[i] = Rzz[i] + ( fzz[i] - (chiz[i] * chiz[i]) / (chin1[i] * TWO) + (dzz[i] + ONE) * f[i] ) / (chin1[i] * TWO);
|
||||||
|
|
||||||
Rxy[i] = Rxy[i] + ( fxy[i] - (chix[i] * chiy[i]) / (chin1[i] * TWO) + gxy[i] * f[i] ) / (chin1[i] * TWO);
|
Rxy[i] = Rxy[i] + ( fxy[i] - (chix[i] * chiy[i]) / (chin1[i] * TWO) + gxy[i] * f[i] ) / (chin1[i] * TWO);
|
||||||
Rxz[i] = Rxz[i] + ( fxz[i] - (chix[i] * chiz[i]) / (chin1[i] * TWO) + gxz[i] * f[i] ) / (chin1[i] * TWO);
|
Rxz[i] = Rxz[i] + ( fxz[i] - (chix[i] * chiz[i]) / (chin1[i] * TWO) + gxz[i] * f[i] ) / (chin1[i] * TWO);
|
||||||
@@ -760,17 +726,17 @@ int f_compute_rhs_bssn(int *ex, double &T,
|
|||||||
gxxz[i] = (gupxz[i] * chix[i] + gupyz[i] * chiy[i] + gupzz[i] * chiz[i]) / chin1[i];
|
gxxz[i] = (gupxz[i] * chix[i] + gupyz[i] * chiy[i] + gupzz[i] * chiz[i]) / chin1[i];
|
||||||
|
|
||||||
/* Christoffel 修正项 */
|
/* Christoffel 修正项 */
|
||||||
Gamxxx[i] = Gamxxx[i] - ( ((chix[i] + chix[i]) / chin1[i]) - gxx[i] * gxxx[i] ) * HALF;
|
Gamxxx[i] = Gamxxx[i] - ( ((chix[i] + chix[i]) / chin1[i]) - (dxx[i] + ONE) * gxxx[i] ) * HALF;
|
||||||
Gamyxx[i] = Gamyxx[i] - ( 0.0 - gxx[i] * gxxy[i] ) * HALF; /* 原式只有 -gxx*gxxy */
|
Gamyxx[i] = Gamyxx[i] - ( 0.0 - (dxx[i] + ONE) * gxxy[i] ) * HALF; /* 原式只有 -gxx*gxxy */
|
||||||
Gamzxx[i] = Gamzxx[i] - ( 0.0 - gxx[i] * gxxz[i] ) * HALF;
|
Gamzxx[i] = Gamzxx[i] - ( 0.0 - (dxx[i] + ONE) * gxxz[i] ) * HALF;
|
||||||
|
|
||||||
Gamxyy[i] = Gamxyy[i] - ( 0.0 - gyy[i] * gxxx[i] ) * HALF;
|
Gamxyy[i] = Gamxyy[i] - ( 0.0 - (dyy[i] + ONE) * gxxx[i] ) * HALF;
|
||||||
Gamyyy[i] = Gamyyy[i] - ( ((chiy[i] + chiy[i]) / chin1[i]) - gyy[i] * gxxy[i] ) * HALF;
|
Gamyyy[i] = Gamyyy[i] - ( ((chiy[i] + chiy[i]) / chin1[i]) - (dyy[i] + ONE) * gxxy[i] ) * HALF;
|
||||||
Gamzyy[i] = Gamzyy[i] - ( 0.0 - gyy[i] * gxxz[i] ) * HALF;
|
Gamzyy[i] = Gamzyy[i] - ( 0.0 - (dyy[i] + ONE) * gxxz[i] ) * HALF;
|
||||||
|
|
||||||
Gamxzz[i] = Gamxzz[i] - ( 0.0 - gzz[i] * gxxx[i] ) * HALF;
|
Gamxzz[i] = Gamxzz[i] - ( 0.0 - (dzz[i] + ONE) * gxxx[i] ) * HALF;
|
||||||
Gamyzz[i] = Gamyzz[i] - ( 0.0 - gzz[i] * gxxy[i] ) * HALF;
|
Gamyzz[i] = Gamyzz[i] - ( 0.0 - (dzz[i] + ONE) * gxxy[i] ) * HALF;
|
||||||
Gamzzz[i] = Gamzzz[i] - ( ((chiz[i] + chiz[i]) / chin1[i]) - gzz[i] * gxxz[i] ) * HALF;
|
Gamzzz[i] = Gamzzz[i] - ( ((chiz[i] + chiz[i]) / chin1[i]) - (dzz[i] + ONE) * gxxz[i] ) * HALF;
|
||||||
|
|
||||||
Gamxxy[i] = Gamxxy[i] - ( ( chiy[i] / chin1[i]) - gxy[i] * gxxx[i] ) * HALF;
|
Gamxxy[i] = Gamxxy[i] - ( ( chiy[i] / chin1[i]) - gxy[i] * gxxx[i] ) * HALF;
|
||||||
Gamyxy[i] = Gamyxy[i] - ( ( chix[i] / chin1[i]) - gxy[i] * gxxy[i] ) * HALF;
|
Gamyxy[i] = Gamyxy[i] - ( ( chix[i] / chin1[i]) - gxy[i] * gxxy[i] ) * HALF;
|
||||||
@@ -792,14 +758,13 @@ int f_compute_rhs_bssn(int *ex, double &T,
|
|||||||
fxy[i] = fxy[i] - Gamxxy[i] * Lapx[i] - Gamyxy[i] * Lapy[i] - Gamzxy[i] * Lapz[i];
|
fxy[i] = fxy[i] - Gamxxy[i] * Lapx[i] - Gamyxy[i] * Lapy[i] - Gamzxy[i] * Lapz[i];
|
||||||
fxz[i] = fxz[i] - Gamxxz[i] * Lapx[i] - Gamyxz[i] * Lapy[i] - Gamzxz[i] * Lapz[i];
|
fxz[i] = fxz[i] - Gamxxz[i] * Lapx[i] - Gamyxz[i] * Lapy[i] - Gamzxz[i] * Lapz[i];
|
||||||
fyz[i] = fyz[i] - Gamxyz[i] * Lapx[i] - Gamyyz[i] * Lapy[i] - Gamzyz[i] * Lapz[i];
|
fyz[i] = fyz[i] - Gamxyz[i] * Lapx[i] - Gamyyz[i] * Lapy[i] - Gamzyz[i] * Lapz[i];
|
||||||
}
|
|
||||||
// 1ms //
|
|
||||||
for (int i=0;i<all;i+=1) {
|
|
||||||
trK_rhs[i] = gupxx[i] * fxx[i] + gupyy[i] * fyy[i] + gupzz[i] * fzz[i]
|
trK_rhs[i] = gupxx[i] * fxx[i] + gupyy[i] * fyy[i] + gupzz[i] * fzz[i]
|
||||||
+ TWO * ( gupxy[i] * fxy[i] + gupxz[i] * fxz[i] + gupyz[i] * fyz[i] );
|
+ TWO * ( gupxy[i] * fxy[i] + gupxz[i] * fxz[i] + gupyz[i] * fyz[i] );
|
||||||
}
|
}
|
||||||
// 2.5ms //
|
// 2.5ms //
|
||||||
for (int i=0;i<all;i+=1) {
|
for (int i=0;i<all;i+=1) {
|
||||||
|
const double divb = betaxx[i] + betayy[i] + betazz[i];
|
||||||
|
|
||||||
S[i] = chin1[i] * (
|
S[i] = chin1[i] * (
|
||||||
gupxx[i] * Sxx[i] + gupyy[i] * Syy[i] + gupzz[i] * Szz[i]
|
gupxx[i] * Sxx[i] + gupyy[i] * Syy[i] + gupzz[i] * Szz[i]
|
||||||
@@ -850,23 +815,20 @@ int f_compute_rhs_bssn(int *ex, double &T,
|
|||||||
+ (alpn1[i] / chin1[i]) * f[i]
|
+ (alpn1[i] / chin1[i]) * f[i]
|
||||||
);
|
);
|
||||||
|
|
||||||
fxx[i] = alpn1[i] * (Rxx[i] - EIGHT * PI * Sxx[i]) - fxx[i];
|
double l_fxx = alpn1[i] * (Rxx[i] - EIGHT * PI * Sxx[i]) - fxx[i];
|
||||||
fxy[i] = alpn1[i] * (Rxy[i] - EIGHT * PI * Sxy[i]) - fxy[i];
|
double l_fxy = alpn1[i] * (Rxy[i] - EIGHT * PI * Sxy[i]) - fxy[i];
|
||||||
fxz[i] = alpn1[i] * (Rxz[i] - EIGHT * PI * Sxz[i]) - fxz[i];
|
double l_fxz = alpn1[i] * (Rxz[i] - EIGHT * PI * Sxz[i]) - fxz[i];
|
||||||
fyy[i] = alpn1[i] * (Ryy[i] - EIGHT * PI * Syy[i]) - fyy[i];
|
double l_fyy = alpn1[i] * (Ryy[i] - EIGHT * PI * Syy[i]) - fyy[i];
|
||||||
fyz[i] = alpn1[i] * (Ryz[i] - EIGHT * PI * Syz[i]) - fyz[i];
|
double l_fyz = alpn1[i] * (Ryz[i] - EIGHT * PI * Syz[i]) - fyz[i];
|
||||||
fzz[i] = alpn1[i] * (Rzz[i] - EIGHT * PI * Szz[i]) - fzz[i];
|
double l_fzz = alpn1[i] * (Rzz[i] - EIGHT * PI * Szz[i]) - fzz[i];
|
||||||
}
|
|
||||||
// 8ms //
|
|
||||||
for (int i=0;i<all;i+=1) {
|
|
||||||
|
|
||||||
/* Aij_rhs = fij - gij * f */
|
/* Aij_rhs = fij - gij * f */
|
||||||
Axx_rhs[i] = fxx[i] - gxx[i] * f[i];
|
Axx_rhs[i] = l_fxx - (dxx[i] + ONE) * f[i];
|
||||||
Ayy_rhs[i] = fyy[i] - gyy[i] * f[i];
|
Ayy_rhs[i] = l_fyy - (dyy[i] + ONE) * f[i];
|
||||||
Azz_rhs[i] = fzz[i] - gzz[i] * f[i];
|
Azz_rhs[i] = l_fzz - (dzz[i] + ONE) * f[i];
|
||||||
Axy_rhs[i] = fxy[i] - gxy[i] * f[i];
|
Axy_rhs[i] = l_fxy - gxy[i] * f[i];
|
||||||
Axz_rhs[i] = fxz[i] - gxz[i] * f[i];
|
Axz_rhs[i] = l_fxz - gxz[i] * f[i];
|
||||||
Ayz_rhs[i] = fyz[i] - gyz[i] * f[i];
|
Ayz_rhs[i] = l_fyz - gyz[i] * f[i];
|
||||||
|
|
||||||
/* Now: store A_il A^l_j into fij: */
|
/* Now: store A_il A^l_j into fij: */
|
||||||
fxx[i] =
|
fxx[i] =
|
||||||
@@ -928,19 +890,19 @@ int f_compute_rhs_bssn(int *ex, double &T,
|
|||||||
f[i] * Axx_rhs[i]
|
f[i] * Axx_rhs[i]
|
||||||
+ alpn1[i] * ( trK[i] * Axx[i] - TWO * fxx[i] )
|
+ alpn1[i] * ( trK[i] * Axx[i] - TWO * fxx[i] )
|
||||||
+ TWO * ( Axx[i] * betaxx[i] + Axy[i] * betayx[i] + Axz[i] * betazx[i] )
|
+ TWO * ( Axx[i] * betaxx[i] + Axy[i] * betayx[i] + Axz[i] * betazx[i] )
|
||||||
- F2o3 * Axx[i] * div_beta[i];
|
- F2o3 * Axx[i] * divb;
|
||||||
|
|
||||||
Ayy_rhs[i] =
|
Ayy_rhs[i] =
|
||||||
f[i] * Ayy_rhs[i]
|
f[i] * Ayy_rhs[i]
|
||||||
+ alpn1[i] * ( trK[i] * Ayy[i] - TWO * fyy[i] )
|
+ alpn1[i] * ( trK[i] * Ayy[i] - TWO * fyy[i] )
|
||||||
+ TWO * ( Axy[i] * betaxy[i] + Ayy[i] * betayy[i] + Ayz[i] * betazy[i] )
|
+ TWO * ( Axy[i] * betaxy[i] + Ayy[i] * betayy[i] + Ayz[i] * betazy[i] )
|
||||||
- F2o3 * Ayy[i] * div_beta[i];
|
- F2o3 * Ayy[i] * divb;
|
||||||
|
|
||||||
Azz_rhs[i] =
|
Azz_rhs[i] =
|
||||||
f[i] * Azz_rhs[i]
|
f[i] * Azz_rhs[i]
|
||||||
+ alpn1[i] * ( trK[i] * Azz[i] - TWO * fzz[i] )
|
+ alpn1[i] * ( trK[i] * Azz[i] - TWO * fzz[i] )
|
||||||
+ TWO * ( Axz[i] * betaxz[i] + Ayz[i] * betayz[i] + Azz[i] * betazz[i] )
|
+ TWO * ( Axz[i] * betaxz[i] + Ayz[i] * betayz[i] + Azz[i] * betazz[i] )
|
||||||
- F2o3 * Azz[i] * div_beta[i];
|
- F2o3 * Azz[i] * divb;
|
||||||
|
|
||||||
Axy_rhs[i] =
|
Axy_rhs[i] =
|
||||||
f[i] * Axy_rhs[i]
|
f[i] * Axy_rhs[i]
|
||||||
@@ -949,7 +911,7 @@ int f_compute_rhs_bssn(int *ex, double &T,
|
|||||||
+ Axz[i] * betazy[i]
|
+ Axz[i] * betazy[i]
|
||||||
+ Ayy[i] * betayx[i]
|
+ Ayy[i] * betayx[i]
|
||||||
+ Ayz[i] * betazx[i]
|
+ Ayz[i] * betazx[i]
|
||||||
+ F1o3 * Axy[i] * div_beta[i]
|
+ F1o3 * Axy[i] * divb
|
||||||
- Axy[i] * betazz[i];
|
- Axy[i] * betazz[i];
|
||||||
|
|
||||||
Ayz_rhs[i] =
|
Ayz_rhs[i] =
|
||||||
@@ -959,7 +921,7 @@ int f_compute_rhs_bssn(int *ex, double &T,
|
|||||||
+ Ayy[i] * betayz[i]
|
+ Ayy[i] * betayz[i]
|
||||||
+ Axz[i] * betaxy[i]
|
+ Axz[i] * betaxy[i]
|
||||||
+ Azz[i] * betazy[i]
|
+ Azz[i] * betazy[i]
|
||||||
+ F1o3 * Ayz[i] * div_beta[i]
|
+ F1o3 * Ayz[i] * divb
|
||||||
- Ayz[i] * betaxx[i];
|
- Ayz[i] * betaxx[i];
|
||||||
|
|
||||||
Axz_rhs[i] =
|
Axz_rhs[i] =
|
||||||
@@ -969,7 +931,7 @@ int f_compute_rhs_bssn(int *ex, double &T,
|
|||||||
+ Axy[i] * betayz[i]
|
+ Axy[i] * betayz[i]
|
||||||
+ Ayz[i] * betayx[i]
|
+ Ayz[i] * betayx[i]
|
||||||
+ Azz[i] * betazx[i]
|
+ Azz[i] * betazx[i]
|
||||||
+ F1o3 * Axz[i] * div_beta[i]
|
+ F1o3 * Axz[i] * divb
|
||||||
- Axz[i] * betayy[i];
|
- Axz[i] * betayy[i];
|
||||||
|
|
||||||
/* Compute trace of S_ij */
|
/* Compute trace of S_ij */
|
||||||
@@ -1100,58 +1062,31 @@ int f_compute_rhs_bssn(int *ex, double &T,
|
|||||||
dtSfz_rhs[i] = Gamz_rhs[i] - reta[i] * dtSfz[i];
|
dtSfz_rhs[i] = Gamz_rhs[i] - reta[i] * dtSfz[i];
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
// 26ms //
|
// advection + KO dissipation with shared symmetry buffer
|
||||||
lopsided(ex,X,Y,Z,gxx,gxx_rhs,betax,betay,betaz,Symmetry,SSS);
|
lopsided_kodis(ex,X,Y,Z,dxx,gxx_rhs,betax,betay,betaz,Symmetry,SSS,eps);
|
||||||
lopsided(ex,X,Y,Z,Gamz,Gamz_rhs,betax,betay,betaz,Symmetry,SSA);
|
lopsided_kodis(ex,X,Y,Z,Gamz,Gamz_rhs,betax,betay,betaz,Symmetry,SSA,eps);
|
||||||
lopsided(ex,X,Y,Z,gxy,gxy_rhs,betax,betay,betaz,Symmetry,AAS);
|
lopsided_kodis(ex,X,Y,Z,gxy,gxy_rhs,betax,betay,betaz,Symmetry,AAS,eps);
|
||||||
lopsided(ex,X,Y,Z,Lap,Lap_rhs,betax,betay,betaz,Symmetry,SSS);
|
lopsided_kodis(ex,X,Y,Z,Lap,Lap_rhs,betax,betay,betaz,Symmetry,SSS,eps);
|
||||||
lopsided(ex,X,Y,Z,gxz,gxz_rhs,betax,betay,betaz,Symmetry,ASA);
|
lopsided_kodis(ex,X,Y,Z,gxz,gxz_rhs,betax,betay,betaz,Symmetry,ASA,eps);
|
||||||
lopsided(ex,X,Y,Z,betax,betax_rhs,betax,betay,betaz,Symmetry,ASS);
|
lopsided_kodis(ex,X,Y,Z,betax,betax_rhs,betax,betay,betaz,Symmetry,ASS,eps);
|
||||||
lopsided(ex,X,Y,Z,gyy,gyy_rhs,betax,betay,betaz,Symmetry,SSS);
|
lopsided_kodis(ex,X,Y,Z,dyy,gyy_rhs,betax,betay,betaz,Symmetry,SSS,eps);
|
||||||
lopsided(ex,X,Y,Z,betay,betay_rhs,betax,betay,betaz,Symmetry,SAS);
|
lopsided_kodis(ex,X,Y,Z,betay,betay_rhs,betax,betay,betaz,Symmetry,SAS,eps);
|
||||||
lopsided(ex,X,Y,Z,gyz,gyz_rhs,betax,betay,betaz,Symmetry,SAA);
|
lopsided_kodis(ex,X,Y,Z,gyz,gyz_rhs,betax,betay,betaz,Symmetry,SAA,eps);
|
||||||
lopsided(ex,X,Y,Z,betaz,betaz_rhs,betax,betay,betaz,Symmetry,SSA);
|
lopsided_kodis(ex,X,Y,Z,betaz,betaz_rhs,betax,betay,betaz,Symmetry,SSA,eps);
|
||||||
lopsided(ex,X,Y,Z,gzz,gzz_rhs,betax,betay,betaz,Symmetry,SSS);
|
lopsided_kodis(ex,X,Y,Z,dzz,gzz_rhs,betax,betay,betaz,Symmetry,SSS,eps);
|
||||||
lopsided(ex,X,Y,Z,dtSfx,dtSfx_rhs,betax,betay,betaz,Symmetry,ASS);
|
lopsided_kodis(ex,X,Y,Z,dtSfx,dtSfx_rhs,betax,betay,betaz,Symmetry,ASS,eps);
|
||||||
lopsided(ex,X,Y,Z,Axx,Axx_rhs,betax,betay,betaz,Symmetry,SSS);
|
lopsided_kodis(ex,X,Y,Z,Axx,Axx_rhs,betax,betay,betaz,Symmetry,SSS,eps);
|
||||||
lopsided(ex,X,Y,Z,dtSfy,dtSfy_rhs,betax,betay,betaz,Symmetry,SAS);
|
lopsided_kodis(ex,X,Y,Z,dtSfy,dtSfy_rhs,betax,betay,betaz,Symmetry,SAS,eps);
|
||||||
lopsided(ex,X,Y,Z,Axy,Axy_rhs,betax,betay,betaz,Symmetry,AAS);
|
lopsided_kodis(ex,X,Y,Z,Axy,Axy_rhs,betax,betay,betaz,Symmetry,AAS,eps);
|
||||||
lopsided(ex,X,Y,Z,dtSfz,dtSfz_rhs,betax,betay,betaz,Symmetry,SSA);
|
lopsided_kodis(ex,X,Y,Z,dtSfz,dtSfz_rhs,betax,betay,betaz,Symmetry,SSA,eps);
|
||||||
lopsided(ex,X,Y,Z,Axz,Axz_rhs,betax,betay,betaz,Symmetry,ASA);
|
lopsided_kodis(ex,X,Y,Z,Axz,Axz_rhs,betax,betay,betaz,Symmetry,ASA,eps);
|
||||||
lopsided(ex,X,Y,Z,Ayy,Ayy_rhs,betax,betay,betaz,Symmetry,SSS);
|
lopsided_kodis(ex,X,Y,Z,Ayy,Ayy_rhs,betax,betay,betaz,Symmetry,SSS,eps);
|
||||||
lopsided(ex,X,Y,Z,Ayz,Ayz_rhs,betax,betay,betaz,Symmetry,SAA);
|
lopsided_kodis(ex,X,Y,Z,Ayz,Ayz_rhs,betax,betay,betaz,Symmetry,SAA,eps);
|
||||||
lopsided(ex,X,Y,Z,Azz,Azz_rhs,betax,betay,betaz,Symmetry,SSS);
|
lopsided_kodis(ex,X,Y,Z,Azz,Azz_rhs,betax,betay,betaz,Symmetry,SSS,eps);
|
||||||
lopsided(ex,X,Y,Z,chi,chi_rhs,betax,betay,betaz,Symmetry,SSS);
|
lopsided_kodis(ex,X,Y,Z,chi,chi_rhs,betax,betay,betaz,Symmetry,SSS,eps);
|
||||||
lopsided(ex,X,Y,Z,trK,trK_rhs,betax,betay,betaz,Symmetry,SSS);
|
lopsided_kodis(ex,X,Y,Z,trK,trK_rhs,betax,betay,betaz,Symmetry,SSS,eps);
|
||||||
lopsided(ex,X,Y,Z,Gamx,Gamx_rhs,betax,betay,betaz,Symmetry,ASS);
|
lopsided_kodis(ex,X,Y,Z,Gamx,Gamx_rhs,betax,betay,betaz,Symmetry,ASS,eps);
|
||||||
lopsided(ex,X,Y,Z,Gamy,Gamy_rhs,betax,betay,betaz,Symmetry,SAS);
|
lopsided_kodis(ex,X,Y,Z,Gamy,Gamy_rhs,betax,betay,betaz,Symmetry,SAS,eps);
|
||||||
// 20ms //
|
|
||||||
if(eps>0){
|
|
||||||
kodis(ex,X,Y,Z,chi,chi_rhs,SSS,Symmetry,eps);
|
|
||||||
kodis(ex,X,Y,Z,trK,trK_rhs,SSS,Symmetry,eps);
|
|
||||||
kodis(ex,X,Y,Z,dxx,gxx_rhs,SSS,Symmetry,eps);
|
|
||||||
kodis(ex,X,Y,Z,gxy,gxy_rhs,AAS,Symmetry,eps);
|
|
||||||
kodis(ex,X,Y,Z,gxz,gxz_rhs,ASA,Symmetry,eps);
|
|
||||||
kodis(ex,X,Y,Z,dyy,gyy_rhs,SSS,Symmetry,eps);
|
|
||||||
kodis(ex,X,Y,Z,gyz,gyz_rhs,SAA,Symmetry,eps);
|
|
||||||
kodis(ex,X,Y,Z,dzz,gzz_rhs,SSS,Symmetry,eps);
|
|
||||||
kodis(ex,X,Y,Z,Axx,Axx_rhs,SSS,Symmetry,eps);
|
|
||||||
kodis(ex,X,Y,Z,dtSfz,dtSfz_rhs,SSA,Symmetry,eps);
|
|
||||||
kodis(ex,X,Y,Z,Axy,Axy_rhs,AAS,Symmetry,eps);
|
|
||||||
kodis(ex,X,Y,Z,dtSfy,dtSfy_rhs,SAS,Symmetry,eps);
|
|
||||||
kodis(ex,X,Y,Z,Axz,Axz_rhs,ASA,Symmetry,eps);
|
|
||||||
kodis(ex,X,Y,Z,dtSfx,dtSfx_rhs,ASS,Symmetry,eps);
|
|
||||||
kodis(ex,X,Y,Z,Ayy,Ayy_rhs,SSS,Symmetry,eps);
|
|
||||||
kodis(ex,X,Y,Z,betaz,betaz_rhs,SSA,Symmetry,eps);
|
|
||||||
kodis(ex,X,Y,Z,Ayz,Ayz_rhs,SAA,Symmetry,eps);
|
|
||||||
kodis(ex,X,Y,Z,betay,betay_rhs,SAS,Symmetry,eps);
|
|
||||||
kodis(ex,X,Y,Z,Azz,Azz_rhs,SSS,Symmetry,eps);
|
|
||||||
kodis(ex,X,Y,Z,betax,betax_rhs,ASS,Symmetry,eps);
|
|
||||||
kodis(ex,X,Y,Z,Gamx,Gamx_rhs,ASS,Symmetry,eps);
|
|
||||||
kodis(ex,X,Y,Z,Lap,Lap_rhs,SSS,Symmetry,eps);
|
|
||||||
kodis(ex,X,Y,Z,Gamy,Gamy_rhs,SAS,Symmetry,eps);
|
|
||||||
kodis(ex,X,Y,Z,Gamz,Gamz_rhs,SSA,Symmetry,eps);
|
|
||||||
}
|
|
||||||
// 2ms //
|
// 2ms //
|
||||||
if(co==0){
|
if(co==0){
|
||||||
for (int i=0;i<all;i+=1) {
|
for (int i=0;i<all;i+=1) {
|
||||||
|
|||||||
@@ -33,7 +33,7 @@
|
|||||||
real*8 :: dX,dY,dZ
|
real*8 :: dX,dY,dZ
|
||||||
real*8,dimension(0:ex(1),0:ex(2),0:ex(3)) :: fh
|
real*8,dimension(0:ex(1),0:ex(2),0:ex(3)) :: fh
|
||||||
real*8, dimension(3) :: SoA
|
real*8, dimension(3) :: SoA
|
||||||
integer :: imin,jmin,kmin,imax,jmax,kmax,i,j,k
|
integer :: imin,jmin,kmin,imax,jmax,kmax,i,j,k
|
||||||
real*8 :: d2dx,d2dy,d2dz
|
real*8 :: d2dx,d2dy,d2dz
|
||||||
integer, parameter :: NO_SYMM = 0, EQ_SYMM = 1, OCTANT = 2
|
integer, parameter :: NO_SYMM = 0, EQ_SYMM = 1, OCTANT = 2
|
||||||
real*8, parameter :: ZEO=0.d0,ONE=1.d0, F60=6.d1
|
real*8, parameter :: ZEO=0.d0,ONE=1.d0, F60=6.d1
|
||||||
@@ -137,7 +137,7 @@
|
|||||||
real*8 :: dX
|
real*8 :: dX
|
||||||
real*8,dimension(0:ex(1),0:ex(2),0:ex(3)) :: fh
|
real*8,dimension(0:ex(1),0:ex(2),0:ex(3)) :: fh
|
||||||
real*8, dimension(3) :: SoA
|
real*8, dimension(3) :: SoA
|
||||||
integer :: imin,jmin,kmin,imax,jmax,kmax,i,j,k
|
integer :: imin,jmin,kmin,imax,jmax,kmax,i,j,k
|
||||||
real*8 :: d2dx
|
real*8 :: d2dx
|
||||||
integer, parameter :: NO_SYMM = 0, EQ_SYMM = 1, OCTANT = 2
|
integer, parameter :: NO_SYMM = 0, EQ_SYMM = 1, OCTANT = 2
|
||||||
real*8, parameter :: ZEO=0.d0,ONE=1.d0, F60=6.d1
|
real*8, parameter :: ZEO=0.d0,ONE=1.d0, F60=6.d1
|
||||||
@@ -1512,8 +1512,9 @@
|
|||||||
real*8 :: dX,dY,dZ
|
real*8 :: dX,dY,dZ
|
||||||
real*8,dimension(-1:ex(1),-1:ex(2),-1:ex(3)) :: fh
|
real*8,dimension(-1:ex(1),-1:ex(2),-1:ex(3)) :: fh
|
||||||
real*8, dimension(3) :: SoA
|
real*8, dimension(3) :: SoA
|
||||||
integer :: imin,jmin,kmin,imax,jmax,kmax,i,j,k
|
integer :: imin,jmin,kmin,imax,jmax,kmax,i,j,k
|
||||||
real*8 :: Sdxdx,Sdydy,Sdzdz,Fdxdx,Fdydy,Fdzdz
|
integer :: i_core_min,i_core_max,j_core_min,j_core_max,k_core_min,k_core_max
|
||||||
|
real*8 :: Sdxdx,Sdydy,Sdzdz,Fdxdx,Fdydy,Fdzdz
|
||||||
real*8 :: Sdxdy,Sdxdz,Sdydz,Fdxdy,Fdxdz,Fdydz
|
real*8 :: Sdxdy,Sdxdz,Sdydz,Fdxdy,Fdxdz,Fdydz
|
||||||
integer, parameter :: NO_SYMM = 0, EQ_SYMM = 1, OCTANT = 2
|
integer, parameter :: NO_SYMM = 0, EQ_SYMM = 1, OCTANT = 2
|
||||||
real*8, parameter :: ZEO=0.d0, ONE=1.d0, TWO=2.d0, F1o4=2.5d-1, F9=9.d0, F45=4.5d1
|
real*8, parameter :: ZEO=0.d0, ONE=1.d0, TWO=2.d0, F1o4=2.5d-1, F9=9.d0, F45=4.5d1
|
||||||
@@ -1560,17 +1561,55 @@
|
|||||||
|
|
||||||
fxx = ZEO
|
fxx = ZEO
|
||||||
fyy = ZEO
|
fyy = ZEO
|
||||||
fzz = ZEO
|
fzz = ZEO
|
||||||
fxy = ZEO
|
fxy = ZEO
|
||||||
fxz = ZEO
|
fxz = ZEO
|
||||||
fyz = ZEO
|
fyz = ZEO
|
||||||
|
|
||||||
do k=1,ex(3)
|
i_core_min = max(1, imin+2)
|
||||||
do j=1,ex(2)
|
i_core_max = min(ex(1), imax-2)
|
||||||
do i=1,ex(1)
|
j_core_min = max(1, jmin+2)
|
||||||
!~~~~~~ fxx
|
j_core_max = min(ex(2), jmax-2)
|
||||||
if(i+2 <= imax .and. i-2 >= imin)then
|
k_core_min = max(1, kmin+2)
|
||||||
!
|
k_core_max = min(ex(3), kmax-2)
|
||||||
|
|
||||||
|
if(i_core_min <= i_core_max .and. j_core_min <= j_core_max .and. k_core_min <= k_core_max)then
|
||||||
|
do k=k_core_min,k_core_max
|
||||||
|
do j=j_core_min,j_core_max
|
||||||
|
do i=i_core_min,i_core_max
|
||||||
|
! interior points always use 4th-order stencils without branch checks
|
||||||
|
fxx(i,j,k) = Fdxdx*(-fh(i-2,j,k)+F16*fh(i-1,j,k)-F30*fh(i,j,k) &
|
||||||
|
-fh(i+2,j,k)+F16*fh(i+1,j,k) )
|
||||||
|
fyy(i,j,k) = Fdydy*(-fh(i,j-2,k)+F16*fh(i,j-1,k)-F30*fh(i,j,k) &
|
||||||
|
-fh(i,j+2,k)+F16*fh(i,j+1,k) )
|
||||||
|
fzz(i,j,k) = Fdzdz*(-fh(i,j,k-2)+F16*fh(i,j,k-1)-F30*fh(i,j,k) &
|
||||||
|
-fh(i,j,k+2)+F16*fh(i,j,k+1) )
|
||||||
|
fxy(i,j,k) = Fdxdy*( (fh(i-2,j-2,k)-F8*fh(i-1,j-2,k)+F8*fh(i+1,j-2,k)-fh(i+2,j-2,k)) &
|
||||||
|
-F8 *(fh(i-2,j-1,k)-F8*fh(i-1,j-1,k)+F8*fh(i+1,j-1,k)-fh(i+2,j-1,k)) &
|
||||||
|
+F8 *(fh(i-2,j+1,k)-F8*fh(i-1,j+1,k)+F8*fh(i+1,j+1,k)-fh(i+2,j+1,k)) &
|
||||||
|
- (fh(i-2,j+2,k)-F8*fh(i-1,j+2,k)+F8*fh(i+1,j+2,k)-fh(i+2,j+2,k)))
|
||||||
|
fxz(i,j,k) = Fdxdz*( (fh(i-2,j,k-2)-F8*fh(i-1,j,k-2)+F8*fh(i+1,j,k-2)-fh(i+2,j,k-2)) &
|
||||||
|
-F8 *(fh(i-2,j,k-1)-F8*fh(i-1,j,k-1)+F8*fh(i+1,j,k-1)-fh(i+2,j,k-1)) &
|
||||||
|
+F8 *(fh(i-2,j,k+1)-F8*fh(i-1,j,k+1)+F8*fh(i+1,j,k+1)-fh(i+2,j,k+1)) &
|
||||||
|
- (fh(i-2,j,k+2)-F8*fh(i-1,j,k+2)+F8*fh(i+1,j,k+2)-fh(i+2,j,k+2)))
|
||||||
|
fyz(i,j,k) = Fdydz*( (fh(i,j-2,k-2)-F8*fh(i,j-1,k-2)+F8*fh(i,j+1,k-2)-fh(i,j+2,k-2)) &
|
||||||
|
-F8 *(fh(i,j-2,k-1)-F8*fh(i,j-1,k-1)+F8*fh(i,j+1,k-1)-fh(i,j+2,k-1)) &
|
||||||
|
+F8 *(fh(i,j-2,k+1)-F8*fh(i,j-1,k+1)+F8*fh(i,j+1,k+1)-fh(i,j+2,k+1)) &
|
||||||
|
- (fh(i,j-2,k+2)-F8*fh(i,j-1,k+2)+F8*fh(i,j+1,k+2)-fh(i,j+2,k+2)))
|
||||||
|
enddo
|
||||||
|
enddo
|
||||||
|
enddo
|
||||||
|
endif
|
||||||
|
|
||||||
|
do k=1,ex(3)
|
||||||
|
do j=1,ex(2)
|
||||||
|
do i=1,ex(1)
|
||||||
|
if(i>=i_core_min .and. i<=i_core_max .and. &
|
||||||
|
j>=j_core_min .and. j<=j_core_max .and. &
|
||||||
|
k>=k_core_min .and. k<=k_core_max) cycle
|
||||||
|
!~~~~~~ fxx
|
||||||
|
if(i+2 <= imax .and. i-2 >= imin)then
|
||||||
|
!
|
||||||
! - f(i-2) + 16 f(i-1) - 30 f(i) + 16 f(i+1) - f(i+2)
|
! - f(i-2) + 16 f(i-1) - 30 f(i) + 16 f(i+1) - f(i+2)
|
||||||
! fxx(i) = ----------------------------------------------------------
|
! fxx(i) = ----------------------------------------------------------
|
||||||
! 12 dx^2
|
! 12 dx^2
|
||||||
|
|||||||
@@ -71,20 +71,14 @@ void fdderivs(const int ex[3],
|
|||||||
const double Fdxdz = F1o144 / (dX * dZ);
|
const double Fdxdz = F1o144 / (dX * dZ);
|
||||||
const double Fdydz = F1o144 / (dY * dZ);
|
const double Fdydz = F1o144 / (dY * dZ);
|
||||||
|
|
||||||
/* 输出清零:fxx,fyy,fzz,fxy,fxz,fyz = 0 */
|
|
||||||
const size_t all = (size_t)ex1 * (size_t)ex2 * (size_t)ex3;
|
const size_t all = (size_t)ex1 * (size_t)ex2 * (size_t)ex3;
|
||||||
for (size_t p = 0; p < all; ++p) {
|
for (size_t p = 0; p < all; ++p) {
|
||||||
fxx[p] = ZEO; fyy[p] = ZEO; fzz[p] = ZEO;
|
fxx[p] = ZEO; fxy[p] = ZEO; fxz[p] = ZEO;
|
||||||
fxy[p] = ZEO; fxz[p] = ZEO; fyz[p] = ZEO;
|
fyy[p] = ZEO; fyz[p] = ZEO; fzz[p] = ZEO;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
// Match Fortran (ghost_width=3, "for bam comparison") exactly:
|
||||||
* Fortran:
|
// only compute when x/y/z all satisfy the same-order stencil at this point.
|
||||||
* do k=1,ex3-1
|
|
||||||
* do j=1,ex2-1
|
|
||||||
* do i=1,ex1-1
|
|
||||||
*/
|
|
||||||
|
|
||||||
for (int k0 = 0; k0 <= ex3 - 2; ++k0) {
|
for (int k0 = 0; k0 <= ex3 - 2; ++k0) {
|
||||||
const int kF = k0 + 1;
|
const int kF = k0 + 1;
|
||||||
for (int j0 = 0; j0 <= ex2 - 2; ++j0) {
|
for (int j0 = 0; j0 <= ex2 - 2; ++j0) {
|
||||||
@@ -93,11 +87,9 @@ void fdderivs(const int ex[3],
|
|||||||
const int iF = i0 + 1;
|
const int iF = i0 + 1;
|
||||||
const size_t p = idx_ex(i0, j0, k0, ex);
|
const size_t p = idx_ex(i0, j0, k0, ex);
|
||||||
|
|
||||||
/* 高阶分支:i±2,j±2,k±2 都在范围内 */
|
if ((iF + 2 <= imaxF && iF - 2 >= iminF) &&
|
||||||
if ((iF + 2) <= imaxF && (iF - 2) >= iminF &&
|
(jF + 2 <= jmaxF && jF - 2 >= jminF) &&
|
||||||
(jF + 2) <= jmaxF && (jF - 2) >= jminF &&
|
(kF + 2 <= kmaxF && kF - 2 >= kminF)) {
|
||||||
(kF + 2) <= kmaxF && (kF - 2) >= kminF)
|
|
||||||
{
|
|
||||||
fxx[p] = Fdxdx * (
|
fxx[p] = Fdxdx * (
|
||||||
-fh[idx_fh_F_ord2(iF - 2, jF, kF, ex)] +
|
-fh[idx_fh_F_ord2(iF - 2, jF, kF, ex)] +
|
||||||
F16 * fh[idx_fh_F_ord2(iF - 1, jF, kF, ex)] -
|
F16 * fh[idx_fh_F_ord2(iF - 1, jF, kF, ex)] -
|
||||||
@@ -105,7 +97,6 @@ void fdderivs(const int ex[3],
|
|||||||
fh[idx_fh_F_ord2(iF + 2, jF, kF, ex)] +
|
fh[idx_fh_F_ord2(iF + 2, jF, kF, ex)] +
|
||||||
F16 * fh[idx_fh_F_ord2(iF + 1, jF, kF, ex)]
|
F16 * fh[idx_fh_F_ord2(iF + 1, jF, kF, ex)]
|
||||||
);
|
);
|
||||||
|
|
||||||
fyy[p] = Fdydy * (
|
fyy[p] = Fdydy * (
|
||||||
-fh[idx_fh_F_ord2(iF, jF - 2, kF, ex)] +
|
-fh[idx_fh_F_ord2(iF, jF - 2, kF, ex)] +
|
||||||
F16 * fh[idx_fh_F_ord2(iF, jF - 1, kF, ex)] -
|
F16 * fh[idx_fh_F_ord2(iF, jF - 1, kF, ex)] -
|
||||||
@@ -113,7 +104,6 @@ void fdderivs(const int ex[3],
|
|||||||
fh[idx_fh_F_ord2(iF, jF + 2, kF, ex)] +
|
fh[idx_fh_F_ord2(iF, jF + 2, kF, ex)] +
|
||||||
F16 * fh[idx_fh_F_ord2(iF, jF + 1, kF, ex)]
|
F16 * fh[idx_fh_F_ord2(iF, jF + 1, kF, ex)]
|
||||||
);
|
);
|
||||||
|
|
||||||
fzz[p] = Fdzdz * (
|
fzz[p] = Fdzdz * (
|
||||||
-fh[idx_fh_F_ord2(iF, jF, kF - 2, ex)] +
|
-fh[idx_fh_F_ord2(iF, jF, kF - 2, ex)] +
|
||||||
F16 * fh[idx_fh_F_ord2(iF, jF, kF - 1, ex)] -
|
F16 * fh[idx_fh_F_ord2(iF, jF, kF - 1, ex)] -
|
||||||
@@ -121,148 +111,76 @@ void fdderivs(const int ex[3],
|
|||||||
fh[idx_fh_F_ord2(iF, jF, kF + 2, ex)] +
|
fh[idx_fh_F_ord2(iF, jF, kF + 2, ex)] +
|
||||||
F16 * fh[idx_fh_F_ord2(iF, jF, kF + 1, ex)]
|
F16 * fh[idx_fh_F_ord2(iF, jF, kF + 1, ex)]
|
||||||
);
|
);
|
||||||
|
fxy[p] = Fdxdy * (
|
||||||
/* fxy 高阶:完全照搬 Fortran 的括号结构 */
|
(fh[idx_fh_F_ord2(iF - 2, jF - 2, kF, ex)] - F8 * fh[idx_fh_F_ord2(iF - 1, jF - 2, kF, ex)] +
|
||||||
{
|
F8 * fh[idx_fh_F_ord2(iF + 1, jF - 2, kF, ex)] - fh[idx_fh_F_ord2(iF + 2, jF - 2, kF, ex)])
|
||||||
const double t_jm2 =
|
- F8 * (fh[idx_fh_F_ord2(iF - 2, jF - 1, kF, ex)] - F8 * fh[idx_fh_F_ord2(iF - 1, jF - 1, kF, ex)] +
|
||||||
( fh[idx_fh_F_ord2(iF - 2, jF - 2, kF, ex)]
|
F8 * fh[idx_fh_F_ord2(iF + 1, jF - 1, kF, ex)] - fh[idx_fh_F_ord2(iF + 2, jF - 1, kF, ex)])
|
||||||
-F8*fh[idx_fh_F_ord2(iF - 1, jF - 2, kF, ex)]
|
+ F8 * (fh[idx_fh_F_ord2(iF - 2, jF + 1, kF, ex)] - F8 * fh[idx_fh_F_ord2(iF - 1, jF + 1, kF, ex)] +
|
||||||
+F8*fh[idx_fh_F_ord2(iF + 1, jF - 2, kF, ex)]
|
F8 * fh[idx_fh_F_ord2(iF + 1, jF + 1, kF, ex)] - fh[idx_fh_F_ord2(iF + 2, jF + 1, kF, ex)])
|
||||||
- fh[idx_fh_F_ord2(iF + 2, jF - 2, kF, ex)] );
|
- (fh[idx_fh_F_ord2(iF - 2, jF + 2, kF, ex)] - F8 * fh[idx_fh_F_ord2(iF - 1, jF + 2, kF, ex)] +
|
||||||
|
F8 * fh[idx_fh_F_ord2(iF + 1, jF + 2, kF, ex)] - fh[idx_fh_F_ord2(iF + 2, jF + 2, kF, ex)])
|
||||||
const double t_jm1 =
|
);
|
||||||
( fh[idx_fh_F_ord2(iF - 2, jF - 1, kF, ex)]
|
fxz[p] = Fdxdz * (
|
||||||
-F8*fh[idx_fh_F_ord2(iF - 1, jF - 1, kF, ex)]
|
(fh[idx_fh_F_ord2(iF - 2, jF, kF - 2, ex)] - F8 * fh[idx_fh_F_ord2(iF - 1, jF, kF - 2, ex)] +
|
||||||
+F8*fh[idx_fh_F_ord2(iF + 1, jF - 1, kF, ex)]
|
F8 * fh[idx_fh_F_ord2(iF + 1, jF, kF - 2, ex)] - fh[idx_fh_F_ord2(iF + 2, jF, kF - 2, ex)])
|
||||||
- fh[idx_fh_F_ord2(iF + 2, jF - 1, kF, ex)] );
|
- F8 * (fh[idx_fh_F_ord2(iF - 2, jF, kF - 1, ex)] - F8 * fh[idx_fh_F_ord2(iF - 1, jF, kF - 1, ex)] +
|
||||||
|
F8 * fh[idx_fh_F_ord2(iF + 1, jF, kF - 1, ex)] - fh[idx_fh_F_ord2(iF + 2, jF, kF - 1, ex)])
|
||||||
const double t_jp1 =
|
+ F8 * (fh[idx_fh_F_ord2(iF - 2, jF, kF + 1, ex)] - F8 * fh[idx_fh_F_ord2(iF - 1, jF, kF + 1, ex)] +
|
||||||
( fh[idx_fh_F_ord2(iF - 2, jF + 1, kF, ex)]
|
F8 * fh[idx_fh_F_ord2(iF + 1, jF, kF + 1, ex)] - fh[idx_fh_F_ord2(iF + 2, jF, kF + 1, ex)])
|
||||||
-F8*fh[idx_fh_F_ord2(iF - 1, jF + 1, kF, ex)]
|
- (fh[idx_fh_F_ord2(iF - 2, jF, kF + 2, ex)] - F8 * fh[idx_fh_F_ord2(iF - 1, jF, kF + 2, ex)] +
|
||||||
+F8*fh[idx_fh_F_ord2(iF + 1, jF + 1, kF, ex)]
|
F8 * fh[idx_fh_F_ord2(iF + 1, jF, kF + 2, ex)] - fh[idx_fh_F_ord2(iF + 2, jF, kF + 2, ex)])
|
||||||
- fh[idx_fh_F_ord2(iF + 2, jF + 1, kF, ex)] );
|
);
|
||||||
|
fyz[p] = Fdydz * (
|
||||||
const double t_jp2 =
|
(fh[idx_fh_F_ord2(iF, jF - 2, kF - 2, ex)] - F8 * fh[idx_fh_F_ord2(iF, jF - 1, kF - 2, ex)] +
|
||||||
( fh[idx_fh_F_ord2(iF - 2, jF + 2, kF, ex)]
|
F8 * fh[idx_fh_F_ord2(iF, jF + 1, kF - 2, ex)] - fh[idx_fh_F_ord2(iF, jF + 2, kF - 2, ex)])
|
||||||
-F8*fh[idx_fh_F_ord2(iF - 1, jF + 2, kF, ex)]
|
- F8 * (fh[idx_fh_F_ord2(iF, jF - 2, kF - 1, ex)] - F8 * fh[idx_fh_F_ord2(iF, jF - 1, kF - 1, ex)] +
|
||||||
+F8*fh[idx_fh_F_ord2(iF + 1, jF + 2, kF, ex)]
|
F8 * fh[idx_fh_F_ord2(iF, jF + 1, kF - 1, ex)] - fh[idx_fh_F_ord2(iF, jF + 2, kF - 1, ex)])
|
||||||
- fh[idx_fh_F_ord2(iF + 2, jF + 2, kF, ex)] );
|
+ F8 * (fh[idx_fh_F_ord2(iF, jF - 2, kF + 1, ex)] - F8 * fh[idx_fh_F_ord2(iF, jF - 1, kF + 1, ex)] +
|
||||||
|
F8 * fh[idx_fh_F_ord2(iF, jF + 1, kF + 1, ex)] - fh[idx_fh_F_ord2(iF, jF + 2, kF + 1, ex)])
|
||||||
fxy[p] = Fdxdy * ( t_jm2 - F8 * t_jm1 + F8 * t_jp1 - t_jp2 );
|
- (fh[idx_fh_F_ord2(iF, jF - 2, kF + 2, ex)] - F8 * fh[idx_fh_F_ord2(iF, jF - 1, kF + 2, ex)] +
|
||||||
}
|
F8 * fh[idx_fh_F_ord2(iF, jF + 1, kF + 2, ex)] - fh[idx_fh_F_ord2(iF, jF + 2, kF + 2, ex)])
|
||||||
|
);
|
||||||
/* fxz 高阶 */
|
} else if ((iF + 1 <= imaxF && iF - 1 >= iminF) &&
|
||||||
{
|
(jF + 1 <= jmaxF && jF - 1 >= jminF) &&
|
||||||
const double t_km2 =
|
(kF + 1 <= kmaxF && kF - 1 >= kminF)) {
|
||||||
( fh[idx_fh_F_ord2(iF - 2, jF, kF - 2, ex)]
|
|
||||||
-F8*fh[idx_fh_F_ord2(iF - 1, jF, kF - 2, ex)]
|
|
||||||
+F8*fh[idx_fh_F_ord2(iF + 1, jF, kF - 2, ex)]
|
|
||||||
- fh[idx_fh_F_ord2(iF + 2, jF, kF - 2, ex)] );
|
|
||||||
|
|
||||||
const double t_km1 =
|
|
||||||
( fh[idx_fh_F_ord2(iF - 2, jF, kF - 1, ex)]
|
|
||||||
-F8*fh[idx_fh_F_ord2(iF - 1, jF, kF - 1, ex)]
|
|
||||||
+F8*fh[idx_fh_F_ord2(iF + 1, jF, kF - 1, ex)]
|
|
||||||
- fh[idx_fh_F_ord2(iF + 2, jF, kF - 1, ex)] );
|
|
||||||
|
|
||||||
const double t_kp1 =
|
|
||||||
( fh[idx_fh_F_ord2(iF - 2, jF, kF + 1, ex)]
|
|
||||||
-F8*fh[idx_fh_F_ord2(iF - 1, jF, kF + 1, ex)]
|
|
||||||
+F8*fh[idx_fh_F_ord2(iF + 1, jF, kF + 1, ex)]
|
|
||||||
- fh[idx_fh_F_ord2(iF + 2, jF, kF + 1, ex)] );
|
|
||||||
|
|
||||||
const double t_kp2 =
|
|
||||||
( fh[idx_fh_F_ord2(iF - 2, jF, kF + 2, ex)]
|
|
||||||
-F8*fh[idx_fh_F_ord2(iF - 1, jF, kF + 2, ex)]
|
|
||||||
+F8*fh[idx_fh_F_ord2(iF + 1, jF, kF + 2, ex)]
|
|
||||||
- fh[idx_fh_F_ord2(iF + 2, jF, kF + 2, ex)] );
|
|
||||||
|
|
||||||
fxz[p] = Fdxdz * ( t_km2 - F8 * t_km1 + F8 * t_kp1 - t_kp2 );
|
|
||||||
}
|
|
||||||
|
|
||||||
/* fyz 高阶 */
|
|
||||||
{
|
|
||||||
const double t_km2 =
|
|
||||||
( fh[idx_fh_F_ord2(iF, jF - 2, kF - 2, ex)]
|
|
||||||
-F8*fh[idx_fh_F_ord2(iF, jF - 1, kF - 2, ex)]
|
|
||||||
+F8*fh[idx_fh_F_ord2(iF, jF + 1, kF - 2, ex)]
|
|
||||||
- fh[idx_fh_F_ord2(iF, jF + 2, kF - 2, ex)] );
|
|
||||||
|
|
||||||
const double t_km1 =
|
|
||||||
( fh[idx_fh_F_ord2(iF, jF - 2, kF - 1, ex)]
|
|
||||||
-F8*fh[idx_fh_F_ord2(iF, jF - 1, kF - 1, ex)]
|
|
||||||
+F8*fh[idx_fh_F_ord2(iF, jF + 1, kF - 1, ex)]
|
|
||||||
- fh[idx_fh_F_ord2(iF, jF + 2, kF - 1, ex)] );
|
|
||||||
|
|
||||||
const double t_kp1 =
|
|
||||||
( fh[idx_fh_F_ord2(iF, jF - 2, kF + 1, ex)]
|
|
||||||
-F8*fh[idx_fh_F_ord2(iF, jF - 1, kF + 1, ex)]
|
|
||||||
+F8*fh[idx_fh_F_ord2(iF, jF + 1, kF + 1, ex)]
|
|
||||||
- fh[idx_fh_F_ord2(iF, jF + 2, kF + 1, ex)] );
|
|
||||||
|
|
||||||
const double t_kp2 =
|
|
||||||
( fh[idx_fh_F_ord2(iF, jF - 2, kF + 2, ex)]
|
|
||||||
-F8*fh[idx_fh_F_ord2(iF, jF - 1, kF + 2, ex)]
|
|
||||||
+F8*fh[idx_fh_F_ord2(iF, jF + 1, kF + 2, ex)]
|
|
||||||
- fh[idx_fh_F_ord2(iF, jF + 2, kF + 2, ex)] );
|
|
||||||
|
|
||||||
fyz[p] = Fdydz * ( t_km2 - F8 * t_km1 + F8 * t_kp1 - t_kp2 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* 二阶分支:i±1,j±1,k±1 在范围内 */
|
|
||||||
else if ((iF + 1) <= imaxF && (iF - 1) >= iminF &&
|
|
||||||
(jF + 1) <= jmaxF && (jF - 1) >= jminF &&
|
|
||||||
(kF + 1) <= kmaxF && (kF - 1) >= kminF)
|
|
||||||
{
|
|
||||||
fxx[p] = Sdxdx * (
|
fxx[p] = Sdxdx * (
|
||||||
fh[idx_fh_F_ord2(iF - 1, jF, kF, ex)] -
|
fh[idx_fh_F_ord2(iF - 1, jF, kF, ex)] -
|
||||||
TWO * fh[idx_fh_F_ord2(iF, jF, kF, ex)] +
|
TWO * fh[idx_fh_F_ord2(iF, jF, kF, ex)] +
|
||||||
fh[idx_fh_F_ord2(iF + 1, jF, kF, ex)]
|
fh[idx_fh_F_ord2(iF + 1, jF, kF, ex)]
|
||||||
);
|
);
|
||||||
|
|
||||||
fyy[p] = Sdydy * (
|
fyy[p] = Sdydy * (
|
||||||
fh[idx_fh_F_ord2(iF, jF - 1, kF, ex)] -
|
fh[idx_fh_F_ord2(iF, jF - 1, kF, ex)] -
|
||||||
TWO * fh[idx_fh_F_ord2(iF, jF, kF, ex)] +
|
TWO * fh[idx_fh_F_ord2(iF, jF, kF, ex)] +
|
||||||
fh[idx_fh_F_ord2(iF, jF + 1, kF, ex)]
|
fh[idx_fh_F_ord2(iF, jF + 1, kF, ex)]
|
||||||
);
|
);
|
||||||
|
|
||||||
fzz[p] = Sdzdz * (
|
fzz[p] = Sdzdz * (
|
||||||
fh[idx_fh_F_ord2(iF, jF, kF - 1, ex)] -
|
fh[idx_fh_F_ord2(iF, jF, kF - 1, ex)] -
|
||||||
TWO * fh[idx_fh_F_ord2(iF, jF, kF, ex)] +
|
TWO * fh[idx_fh_F_ord2(iF, jF, kF, ex)] +
|
||||||
fh[idx_fh_F_ord2(iF, jF, kF + 1, ex)]
|
fh[idx_fh_F_ord2(iF, jF, kF + 1, ex)]
|
||||||
);
|
);
|
||||||
|
|
||||||
fxy[p] = Sdxdy * (
|
fxy[p] = Sdxdy * (
|
||||||
fh[idx_fh_F_ord2(iF - 1, jF - 1, kF, ex)] -
|
fh[idx_fh_F_ord2(iF - 1, jF - 1, kF, ex)] -
|
||||||
fh[idx_fh_F_ord2(iF + 1, jF - 1, kF, ex)] -
|
fh[idx_fh_F_ord2(iF + 1, jF - 1, kF, ex)] -
|
||||||
fh[idx_fh_F_ord2(iF - 1, jF + 1, kF, ex)] +
|
fh[idx_fh_F_ord2(iF - 1, jF + 1, kF, ex)] +
|
||||||
fh[idx_fh_F_ord2(iF + 1, jF + 1, kF, ex)]
|
fh[idx_fh_F_ord2(iF + 1, jF + 1, kF, ex)]
|
||||||
);
|
);
|
||||||
|
|
||||||
fxz[p] = Sdxdz * (
|
fxz[p] = Sdxdz * (
|
||||||
fh[idx_fh_F_ord2(iF - 1, jF, kF - 1, ex)] -
|
fh[idx_fh_F_ord2(iF - 1, jF, kF - 1, ex)] -
|
||||||
fh[idx_fh_F_ord2(iF + 1, jF, kF - 1, ex)] -
|
fh[idx_fh_F_ord2(iF + 1, jF, kF - 1, ex)] -
|
||||||
fh[idx_fh_F_ord2(iF - 1, jF, kF + 1, ex)] +
|
fh[idx_fh_F_ord2(iF - 1, jF, kF + 1, ex)] +
|
||||||
fh[idx_fh_F_ord2(iF + 1, jF, kF + 1, ex)]
|
fh[idx_fh_F_ord2(iF + 1, jF, kF + 1, ex)]
|
||||||
);
|
);
|
||||||
|
|
||||||
fyz[p] = Sdydz * (
|
fyz[p] = Sdydz * (
|
||||||
fh[idx_fh_F_ord2(iF, jF - 1, kF - 1, ex)] -
|
fh[idx_fh_F_ord2(iF, jF - 1, kF - 1, ex)] -
|
||||||
fh[idx_fh_F_ord2(iF, jF + 1, kF - 1, ex)] -
|
fh[idx_fh_F_ord2(iF, jF + 1, kF - 1, ex)] -
|
||||||
fh[idx_fh_F_ord2(iF, jF - 1, kF + 1, ex)] +
|
fh[idx_fh_F_ord2(iF, jF - 1, kF + 1, ex)] +
|
||||||
fh[idx_fh_F_ord2(iF, jF + 1, kF + 1, ex)]
|
fh[idx_fh_F_ord2(iF, jF + 1, kF + 1, ex)]
|
||||||
);
|
);
|
||||||
}else{
|
|
||||||
fxx[p] = 0.0;
|
|
||||||
fyy[p] = 0.0;
|
|
||||||
fzz[p] = 0.0;
|
|
||||||
fxy[p] = 0.0;
|
|
||||||
fxz[p] = 0.0;
|
|
||||||
fyz[p] = 0.0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// free(fh);
|
// free(fh);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -80,14 +80,8 @@ void fderivs(const int ex[3],
|
|||||||
fz[p] = ZEO;
|
fz[p] = ZEO;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
// Match Fortran (ghost_width=3, "for bam comparison") exactly:
|
||||||
* Fortran loops:
|
// only compute when x/y/z all satisfy the same-order stencil at this point.
|
||||||
* do k=1,ex3-1
|
|
||||||
* do j=1,ex2-1
|
|
||||||
* do i=1,ex1-1
|
|
||||||
*
|
|
||||||
* C: k0=0..ex3-2, j0=0..ex2-2, i0=0..ex1-2
|
|
||||||
*/
|
|
||||||
for (int k0 = 0; k0 <= ex3 - 2; ++k0) {
|
for (int k0 = 0; k0 <= ex3 - 2; ++k0) {
|
||||||
const int kF = k0 + 1;
|
const int kF = k0 + 1;
|
||||||
for (int j0 = 0; j0 <= ex2 - 2; ++j0) {
|
for (int j0 = 0; j0 <= ex2 - 2; ++j0) {
|
||||||
@@ -96,47 +90,38 @@ void fderivs(const int ex[3],
|
|||||||
const int iF = i0 + 1;
|
const int iF = i0 + 1;
|
||||||
const size_t p = idx_ex(i0, j0, k0, ex);
|
const size_t p = idx_ex(i0, j0, k0, ex);
|
||||||
|
|
||||||
// if(i+2 <= imax .and. i-2 >= imin ... ) (全是 Fortran 索引)
|
if ((iF + 2 <= imaxF && iF - 2 >= iminF) &&
|
||||||
if ((iF + 2) <= imaxF && (iF - 2) >= iminF &&
|
(jF + 2 <= jmaxF && jF - 2 >= jminF) &&
|
||||||
(jF + 2) <= jmaxF && (jF - 2) >= jminF &&
|
(kF + 2 <= kmaxF && kF - 2 >= kminF)) {
|
||||||
(kF + 2) <= kmaxF && (kF - 2) >= kminF)
|
|
||||||
{
|
|
||||||
fx[p] = d12dx * (
|
fx[p] = d12dx * (
|
||||||
fh[idx_fh_F_ord2(iF - 2, jF, kF, ex)] -
|
fh[idx_fh_F_ord2(iF - 2, jF, kF, ex)] -
|
||||||
EIT * fh[idx_fh_F_ord2(iF - 1, jF, kF, ex)] +
|
EIT * fh[idx_fh_F_ord2(iF - 1, jF, kF, ex)] +
|
||||||
EIT * fh[idx_fh_F_ord2(iF + 1, jF, kF, ex)] -
|
EIT * fh[idx_fh_F_ord2(iF + 1, jF, kF, ex)] -
|
||||||
fh[idx_fh_F_ord2(iF + 2, jF, kF, ex)]
|
fh[idx_fh_F_ord2(iF + 2, jF, kF, ex)]
|
||||||
);
|
);
|
||||||
|
|
||||||
fy[p] = d12dy * (
|
fy[p] = d12dy * (
|
||||||
fh[idx_fh_F_ord2(iF, jF - 2, kF, ex)] -
|
fh[idx_fh_F_ord2(iF, jF - 2, kF, ex)] -
|
||||||
EIT * fh[idx_fh_F_ord2(iF, jF - 1, kF, ex)] +
|
EIT * fh[idx_fh_F_ord2(iF, jF - 1, kF, ex)] +
|
||||||
EIT * fh[idx_fh_F_ord2(iF, jF + 1, kF, ex)] -
|
EIT * fh[idx_fh_F_ord2(iF, jF + 1, kF, ex)] -
|
||||||
fh[idx_fh_F_ord2(iF, jF + 2, kF, ex)]
|
fh[idx_fh_F_ord2(iF, jF + 2, kF, ex)]
|
||||||
);
|
);
|
||||||
|
|
||||||
fz[p] = d12dz * (
|
fz[p] = d12dz * (
|
||||||
fh[idx_fh_F_ord2(iF, jF, kF - 2, ex)] -
|
fh[idx_fh_F_ord2(iF, jF, kF - 2, ex)] -
|
||||||
EIT * fh[idx_fh_F_ord2(iF, jF, kF - 1, ex)] +
|
EIT * fh[idx_fh_F_ord2(iF, jF, kF - 1, ex)] +
|
||||||
EIT * fh[idx_fh_F_ord2(iF, jF, kF + 1, ex)] -
|
EIT * fh[idx_fh_F_ord2(iF, jF, kF + 1, ex)] -
|
||||||
fh[idx_fh_F_ord2(iF, jF, kF + 2, ex)]
|
fh[idx_fh_F_ord2(iF, jF, kF + 2, ex)]
|
||||||
);
|
);
|
||||||
}
|
} else if ((iF + 1 <= imaxF && iF - 1 >= iminF) &&
|
||||||
// elseif(i+1 <= imax .and. i-1 >= imin ...)
|
(jF + 1 <= jmaxF && jF - 1 >= jminF) &&
|
||||||
else if ((iF + 1) <= imaxF && (iF - 1) >= iminF &&
|
(kF + 1 <= kmaxF && kF - 1 >= kminF)) {
|
||||||
(jF + 1) <= jmaxF && (jF - 1) >= jminF &&
|
|
||||||
(kF + 1) <= kmaxF && (kF - 1) >= kminF)
|
|
||||||
{
|
|
||||||
fx[p] = d2dx * (
|
fx[p] = d2dx * (
|
||||||
-fh[idx_fh_F_ord2(iF - 1, jF, kF, ex)] +
|
-fh[idx_fh_F_ord2(iF - 1, jF, kF, ex)] +
|
||||||
fh[idx_fh_F_ord2(iF + 1, jF, kF, ex)]
|
fh[idx_fh_F_ord2(iF + 1, jF, kF, ex)]
|
||||||
);
|
);
|
||||||
|
|
||||||
fy[p] = d2dy * (
|
fy[p] = d2dy * (
|
||||||
-fh[idx_fh_F_ord2(iF, jF - 1, kF, ex)] +
|
-fh[idx_fh_F_ord2(iF, jF - 1, kF, ex)] +
|
||||||
fh[idx_fh_F_ord2(iF, jF + 1, kF, ex)]
|
fh[idx_fh_F_ord2(iF, jF + 1, kF, ex)]
|
||||||
);
|
);
|
||||||
|
|
||||||
fz[p] = d2dz * (
|
fz[p] = d2dz * (
|
||||||
-fh[idx_fh_F_ord2(iF, jF, kF - 1, ex)] +
|
-fh[idx_fh_F_ord2(iF, jF, kF - 1, ex)] +
|
||||||
fh[idx_fh_F_ord2(iF, jF, kF + 1, ex)]
|
fh[idx_fh_F_ord2(iF, jF, kF + 1, ex)]
|
||||||
@@ -147,4 +132,4 @@ void fderivs(const int ex[3],
|
|||||||
}
|
}
|
||||||
|
|
||||||
// free(fh);
|
// free(fh);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1111,27 +1111,177 @@ end subroutine d2dump
|
|||||||
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
! common code for cell and vertex
|
! common code for cell and vertex
|
||||||
!------------------------------------------------------------------------------
|
!------------------------------------------------------------------------------
|
||||||
! Lagrangian polynomial interpolation
|
! Lagrangian polynomial interpolation
|
||||||
!------------------------------------------------------------------------------
|
!------------------------------------------------------------------------------
|
||||||
|
#ifndef POLINT6_USE_BARYCENTRIC
|
||||||
!DIR$ ATTRIBUTES FORCEINLINE :: polint
|
#define POLINT6_USE_BARYCENTRIC 1
|
||||||
subroutine polint(xa, ya, x, y, dy, ordn)
|
#endif
|
||||||
implicit none
|
|
||||||
|
!DIR$ ATTRIBUTES FORCEINLINE :: polint6_neville
|
||||||
integer, intent(in) :: ordn
|
subroutine polint6_neville(xa, ya, x, y, dy)
|
||||||
|
implicit none
|
||||||
|
|
||||||
|
real*8, dimension(6), intent(in) :: xa, ya
|
||||||
|
real*8, intent(in) :: x
|
||||||
|
real*8, intent(out) :: y, dy
|
||||||
|
|
||||||
|
integer :: i, m, ns, n_m
|
||||||
|
real*8, dimension(6) :: c, d, ho
|
||||||
|
real*8 :: dif, dift, hp, h, den_val
|
||||||
|
|
||||||
|
c = ya
|
||||||
|
d = ya
|
||||||
|
ho = xa - x
|
||||||
|
|
||||||
|
ns = 1
|
||||||
|
dif = abs(x - xa(1))
|
||||||
|
|
||||||
|
do i = 2, 6
|
||||||
|
dift = abs(x - xa(i))
|
||||||
|
if (dift < dif) then
|
||||||
|
ns = i
|
||||||
|
dif = dift
|
||||||
|
end if
|
||||||
|
end do
|
||||||
|
|
||||||
|
y = ya(ns)
|
||||||
|
ns = ns - 1
|
||||||
|
|
||||||
|
do m = 1, 5
|
||||||
|
n_m = 6 - m
|
||||||
|
do i = 1, n_m
|
||||||
|
hp = ho(i)
|
||||||
|
h = ho(i+m)
|
||||||
|
den_val = hp - h
|
||||||
|
|
||||||
|
if (den_val == 0.0d0) then
|
||||||
|
write(*,*) 'failure in polint for point',x
|
||||||
|
write(*,*) 'with input points: ',xa
|
||||||
|
stop
|
||||||
|
end if
|
||||||
|
|
||||||
|
den_val = (c(i+1) - d(i)) / den_val
|
||||||
|
|
||||||
|
d(i) = h * den_val
|
||||||
|
c(i) = hp * den_val
|
||||||
|
end do
|
||||||
|
|
||||||
|
if (2 * ns < n_m) then
|
||||||
|
dy = c(ns + 1)
|
||||||
|
else
|
||||||
|
dy = d(ns)
|
||||||
|
ns = ns - 1
|
||||||
|
end if
|
||||||
|
y = y + dy
|
||||||
|
end do
|
||||||
|
|
||||||
|
return
|
||||||
|
end subroutine polint6_neville
|
||||||
|
|
||||||
|
!DIR$ ATTRIBUTES FORCEINLINE :: polint6_barycentric
|
||||||
|
subroutine polint6_barycentric(xa, ya, x, y, dy)
|
||||||
|
implicit none
|
||||||
|
|
||||||
|
real*8, dimension(6), intent(in) :: xa, ya
|
||||||
|
real*8, intent(in) :: x
|
||||||
|
real*8, intent(out) :: y, dy
|
||||||
|
|
||||||
|
integer :: i, j
|
||||||
|
logical :: is_uniform
|
||||||
|
real*8, dimension(6) :: lambda
|
||||||
|
real*8 :: dx, den_i, term, num, den, step, tol
|
||||||
|
real*8, parameter :: c_uniform(6) = (/ -1.d0, 5.d0, -10.d0, 10.d0, -5.d0, 1.d0 /)
|
||||||
|
|
||||||
|
do i = 1, 6
|
||||||
|
if (x == xa(i)) then
|
||||||
|
y = ya(i)
|
||||||
|
dy = 0.d0
|
||||||
|
return
|
||||||
|
end if
|
||||||
|
end do
|
||||||
|
|
||||||
|
step = xa(2) - xa(1)
|
||||||
|
is_uniform = (step /= 0.d0)
|
||||||
|
if (is_uniform) then
|
||||||
|
tol = 64.d0 * epsilon(1.d0) * max(1.d0, abs(step))
|
||||||
|
do i = 3, 6
|
||||||
|
if (abs((xa(i) - xa(i-1)) - step) > tol) then
|
||||||
|
is_uniform = .false.
|
||||||
|
exit
|
||||||
|
end if
|
||||||
|
end do
|
||||||
|
end if
|
||||||
|
|
||||||
|
if (is_uniform) then
|
||||||
|
num = 0.d0
|
||||||
|
den = 0.d0
|
||||||
|
do i = 1, 6
|
||||||
|
term = c_uniform(i) / (x - xa(i))
|
||||||
|
num = num + term * ya(i)
|
||||||
|
den = den + term
|
||||||
|
end do
|
||||||
|
y = num / den
|
||||||
|
dy = 0.d0
|
||||||
|
return
|
||||||
|
end if
|
||||||
|
|
||||||
|
do i = 1, 6
|
||||||
|
den_i = 1.d0
|
||||||
|
do j = 1, 6
|
||||||
|
if (j /= i) then
|
||||||
|
dx = xa(i) - xa(j)
|
||||||
|
if (dx == 0.0d0) then
|
||||||
|
write(*,*) 'failure in polint for point',x
|
||||||
|
write(*,*) 'with input points: ',xa
|
||||||
|
stop
|
||||||
|
end if
|
||||||
|
den_i = den_i * dx
|
||||||
|
end if
|
||||||
|
end do
|
||||||
|
lambda(i) = 1.d0 / den_i
|
||||||
|
end do
|
||||||
|
|
||||||
|
num = 0.d0
|
||||||
|
den = 0.d0
|
||||||
|
do i = 1, 6
|
||||||
|
term = lambda(i) / (x - xa(i))
|
||||||
|
num = num + term * ya(i)
|
||||||
|
den = den + term
|
||||||
|
end do
|
||||||
|
|
||||||
|
y = num / den
|
||||||
|
dy = 0.d0
|
||||||
|
|
||||||
|
return
|
||||||
|
end subroutine polint6_barycentric
|
||||||
|
|
||||||
|
!DIR$ ATTRIBUTES FORCEINLINE :: polint
|
||||||
|
subroutine polint(xa, ya, x, y, dy, ordn)
|
||||||
|
implicit none
|
||||||
|
|
||||||
|
integer, intent(in) :: ordn
|
||||||
real*8, dimension(ordn), intent(in) :: xa, ya
|
real*8, dimension(ordn), intent(in) :: xa, ya
|
||||||
real*8, intent(in) :: x
|
real*8, intent(in) :: x
|
||||||
real*8, intent(out) :: y, dy
|
real*8, intent(out) :: y, dy
|
||||||
|
|
||||||
integer :: i, m, ns, n_m
|
integer :: i, m, ns, n_m
|
||||||
real*8, dimension(ordn) :: c, d, ho
|
real*8, dimension(ordn) :: c, d, ho
|
||||||
real*8 :: dif, dift, hp, h, den_val
|
real*8 :: dif, dift, hp, h, den_val
|
||||||
|
|
||||||
c = ya
|
if (ordn == 6) then
|
||||||
d = ya
|
#if POLINT6_USE_BARYCENTRIC
|
||||||
ho = xa - x
|
call polint6_barycentric(xa, ya, x, y, dy)
|
||||||
|
#else
|
||||||
|
call polint6_neville(xa, ya, x, y, dy)
|
||||||
|
#endif
|
||||||
|
return
|
||||||
|
end if
|
||||||
|
|
||||||
|
c = ya
|
||||||
|
d = ya
|
||||||
|
ho = xa - x
|
||||||
|
|
||||||
ns = 1
|
ns = 1
|
||||||
dif = abs(x - xa(1))
|
dif = abs(x - xa(1))
|
||||||
@@ -1175,13 +1325,48 @@ end subroutine d2dump
|
|||||||
y = y + dy
|
y = y + dy
|
||||||
end do
|
end do
|
||||||
|
|
||||||
return
|
return
|
||||||
end subroutine polint
|
end subroutine polint
|
||||||
!------------------------------------------------------------------------------
|
!------------------------------------------------------------------------------
|
||||||
!
|
! Compute Lagrange interpolation basis weights for one target point.
|
||||||
! interpolation in 2 dimensions, follow yx order
|
!------------------------------------------------------------------------------
|
||||||
!
|
!DIR$ ATTRIBUTES FORCEINLINE :: polint_lagrange_weights
|
||||||
!------------------------------------------------------------------------------
|
subroutine polint_lagrange_weights(xa, x, w, ordn)
|
||||||
|
implicit none
|
||||||
|
|
||||||
|
integer, intent(in) :: ordn
|
||||||
|
real*8, dimension(1:ordn), intent(in) :: xa
|
||||||
|
real*8, intent(in) :: x
|
||||||
|
real*8, dimension(1:ordn), intent(out) :: w
|
||||||
|
|
||||||
|
integer :: i, j
|
||||||
|
real*8 :: num, den, dx
|
||||||
|
|
||||||
|
do i = 1, ordn
|
||||||
|
num = 1.d0
|
||||||
|
den = 1.d0
|
||||||
|
do j = 1, ordn
|
||||||
|
if (j /= i) then
|
||||||
|
dx = xa(i) - xa(j)
|
||||||
|
if (dx == 0.0d0) then
|
||||||
|
write(*,*) 'failure in polint for point',x
|
||||||
|
write(*,*) 'with input points: ',xa
|
||||||
|
stop
|
||||||
|
end if
|
||||||
|
num = num * (x - xa(j))
|
||||||
|
den = den * dx
|
||||||
|
end if
|
||||||
|
end do
|
||||||
|
w(i) = num / den
|
||||||
|
end do
|
||||||
|
|
||||||
|
return
|
||||||
|
end subroutine polint_lagrange_weights
|
||||||
|
!------------------------------------------------------------------------------
|
||||||
|
!
|
||||||
|
! interpolation in 2 dimensions, follow yx order
|
||||||
|
!
|
||||||
|
!------------------------------------------------------------------------------
|
||||||
subroutine polin2(x1a,x2a,ya,x1,x2,y,dy,ordn)
|
subroutine polin2(x1a,x2a,ya,x1,x2,y,dy,ordn)
|
||||||
implicit none
|
implicit none
|
||||||
|
|
||||||
@@ -1229,11 +1414,11 @@ end subroutine d2dump
|
|||||||
real*8, intent(in) :: x1,x2,x3
|
real*8, intent(in) :: x1,x2,x3
|
||||||
real*8, intent(out) :: y,dy
|
real*8, intent(out) :: y,dy
|
||||||
|
|
||||||
#ifdef POLINT_LEGACY_ORDER
|
#ifdef POLINT_LEGACY_ORDER
|
||||||
integer :: i,j,m,n
|
integer :: i,j,m,n
|
||||||
real*8, dimension(ordn,ordn) :: yatmp
|
real*8, dimension(ordn,ordn) :: yatmp
|
||||||
real*8, dimension(ordn) :: ymtmp
|
real*8, dimension(ordn) :: ymtmp
|
||||||
real*8, dimension(ordn) :: yntmp
|
real*8, dimension(ordn) :: yntmp
|
||||||
real*8, dimension(ordn) :: yqtmp
|
real*8, dimension(ordn) :: yqtmp
|
||||||
|
|
||||||
m=size(x1a)
|
m=size(x1a)
|
||||||
@@ -1243,29 +1428,36 @@ end subroutine d2dump
|
|||||||
yqtmp=ya(i,j,:)
|
yqtmp=ya(i,j,:)
|
||||||
call polint(x3a,yqtmp,x3,yatmp(i,j),dy,ordn)
|
call polint(x3a,yqtmp,x3,yatmp(i,j),dy,ordn)
|
||||||
end do
|
end do
|
||||||
yntmp=yatmp(i,:)
|
yntmp=yatmp(i,:)
|
||||||
call polint(x2a,yntmp,x2,ymtmp(i),dy,ordn)
|
call polint(x2a,yntmp,x2,ymtmp(i),dy,ordn)
|
||||||
end do
|
end do
|
||||||
call polint(x1a,ymtmp,x1,y,dy,ordn)
|
call polint(x1a,ymtmp,x1,y,dy,ordn)
|
||||||
#else
|
#else
|
||||||
integer :: j, k
|
integer :: i, j, k
|
||||||
real*8, dimension(ordn,ordn) :: yatmp
|
real*8, dimension(ordn) :: w1, w2
|
||||||
real*8, dimension(ordn) :: ymtmp
|
real*8, dimension(ordn) :: ymtmp
|
||||||
real*8 :: dy_temp
|
real*8 :: yx_sum, x_sum
|
||||||
|
|
||||||
do k=1,ordn
|
call polint_lagrange_weights(x1a, x1, w1, ordn)
|
||||||
do j=1,ordn
|
call polint_lagrange_weights(x2a, x2, w2, ordn)
|
||||||
call polint(x1a, ya(:,j,k), x1, yatmp(j,k), dy_temp, ordn)
|
|
||||||
end do
|
do k = 1, ordn
|
||||||
end do
|
yx_sum = 0.d0
|
||||||
do k=1,ordn
|
do j = 1, ordn
|
||||||
call polint(x2a, yatmp(:,k), x2, ymtmp(k), dy_temp, ordn)
|
x_sum = 0.d0
|
||||||
end do
|
do i = 1, ordn
|
||||||
call polint(x3a, ymtmp, x3, y, dy, ordn)
|
x_sum = x_sum + w1(i) * ya(i,j,k)
|
||||||
#endif
|
end do
|
||||||
|
yx_sum = yx_sum + w2(j) * x_sum
|
||||||
return
|
end do
|
||||||
end subroutine polin3
|
ymtmp(k) = yx_sum
|
||||||
|
end do
|
||||||
|
|
||||||
|
call polint(x3a, ymtmp, x3, y, dy, ordn)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return
|
||||||
|
end subroutine polin3
|
||||||
!--------------------------------------------------------------------------------------
|
!--------------------------------------------------------------------------------------
|
||||||
! calculate L2norm
|
! calculate L2norm
|
||||||
subroutine l2normhelper(ex, X, Y, Z,xmin,ymin,zmin,xmax,ymax,zmax,&
|
subroutine l2normhelper(ex, X, Y, Z,xmin,ymin,zmin,xmax,ymax,zmax,&
|
||||||
@@ -1608,11 +1800,14 @@ deallocate(f_flat)
|
|||||||
! ^
|
! ^
|
||||||
! f=3/8*f_1 + 3/4*f_2 - 1/8*f_3
|
! f=3/8*f_1 + 3/4*f_2 - 1/8*f_3
|
||||||
|
|
||||||
real*8,parameter::C1=3.d0/8.d0,C2=3.d0/4.d0,C3=-1.d0/8.d0
|
real*8,parameter::C1=3.d0/8.d0,C2=3.d0/4.d0,C3=-1.d0/8.d0
|
||||||
|
integer :: i,j,k
|
||||||
fout = C1*f1+C2*f2+C3*f3
|
|
||||||
|
do concurrent (k=1:ext(3), j=1:ext(2), i=1:ext(1))
|
||||||
return
|
fout(i,j,k) = C1*f1(i,j,k)+C2*f2(i,j,k)+C3*f3(i,j,k)
|
||||||
|
end do
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
end subroutine average2
|
end subroutine average2
|
||||||
!-----------------------------------------------------------------------------
|
!-----------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
/* 本头文件由自订profile框架自动生成并非人工硬编码针对Case优化 */
|
||||||
|
/* 更新:负载均衡问题已经通过优化插值函数解决,此profile静态均衡方案已弃用,本头文件现在未参与编译 */
|
||||||
/* Auto-generated from interp_lb_profile.bin — do not edit */
|
/* Auto-generated from interp_lb_profile.bin — do not edit */
|
||||||
#ifndef INTERP_LB_PROFILE_DATA_H
|
#ifndef INTERP_LB_PROFILE_DATA_H
|
||||||
#define INTERP_LB_PROFILE_DATA_H
|
#define INTERP_LB_PROFILE_DATA_H
|
||||||
|
|||||||
@@ -63,19 +63,28 @@ void kodis(const int ex[3],
|
|||||||
* C: k0=0..ex3-1, j0=0..ex2-1, i0=0..ex1-1
|
* C: k0=0..ex3-1, j0=0..ex2-1, i0=0..ex1-1
|
||||||
* 并定义 Fortran index: iF=i0+1, ...
|
* 并定义 Fortran index: iF=i0+1, ...
|
||||||
*/
|
*/
|
||||||
for (int k0 = 0; k0 < ex3; ++k0) {
|
// 收紧循环范围:只遍历满足 iF±3/jF±3/kF±3 条件的内部点
|
||||||
|
// iF-3 >= iminF => iF >= iminF+3 => i0 >= iminF+2 (因为 iF=i0+1)
|
||||||
|
// iF+3 <= imaxF => iF <= imaxF-3 => i0 <= imaxF-4
|
||||||
|
const int i0_lo = (iminF + 2 > 0) ? iminF + 2 : 0;
|
||||||
|
const int j0_lo = (jminF + 2 > 0) ? jminF + 2 : 0;
|
||||||
|
const int k0_lo = (kminF + 2 > 0) ? kminF + 2 : 0;
|
||||||
|
const int i0_hi = imaxF - 4; // inclusive
|
||||||
|
const int j0_hi = jmaxF - 4;
|
||||||
|
const int k0_hi = kmaxF - 4;
|
||||||
|
|
||||||
|
if (i0_lo > i0_hi || j0_lo > j0_hi || k0_lo > k0_hi) {
|
||||||
|
free(fh);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int k0 = k0_lo; k0 <= k0_hi; ++k0) {
|
||||||
const int kF = k0 + 1;
|
const int kF = k0 + 1;
|
||||||
for (int j0 = 0; j0 < ex2; ++j0) {
|
for (int j0 = j0_lo; j0 <= j0_hi; ++j0) {
|
||||||
const int jF = j0 + 1;
|
const int jF = j0 + 1;
|
||||||
for (int i0 = 0; i0 < ex1; ++i0) {
|
for (int i0 = i0_lo; i0 <= i0_hi; ++i0) {
|
||||||
const int iF = i0 + 1;
|
const int iF = i0 + 1;
|
||||||
|
|
||||||
// Fortran if 条件:
|
|
||||||
// i-3 >= imin .and. i+3 <= imax 等(都是 Fortran 索引)
|
|
||||||
if ((iF - 3) >= iminF && (iF + 3) <= imaxF &&
|
|
||||||
(jF - 3) >= jminF && (jF + 3) <= jmaxF &&
|
|
||||||
(kF - 3) >= kminF && (kF + 3) <= kmaxF)
|
|
||||||
{
|
|
||||||
const size_t p = idx_ex(i0, j0, k0, ex);
|
const size_t p = idx_ex(i0, j0, k0, ex);
|
||||||
|
|
||||||
// 三个方向各一份同型的 7 点组合(实际上是对称的 6th-order dissipation/filter 核)
|
// 三个方向各一份同型的 7 点组合(实际上是对称的 6th-order dissipation/filter 核)
|
||||||
@@ -100,7 +109,6 @@ void kodis(const int ex[3],
|
|||||||
// Fortran:
|
// Fortran:
|
||||||
// f_rhs(i,j,k) = f_rhs(i,j,k) + eps/cof*(Dx_term + Dy_term + Dz_term)
|
// f_rhs(i,j,k) = f_rhs(i,j,k) + eps/cof*(Dx_term + Dy_term + Dz_term)
|
||||||
f_rhs[p] += (eps / cof) * (Dx_term + Dy_term + Dz_term);
|
f_rhs[p] += (eps / cof) * (Dx_term + Dy_term + Dz_term);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
248
AMSS_NCKU_source/lopsided_kodis_c.C
Normal file
248
AMSS_NCKU_source/lopsided_kodis_c.C
Normal file
@@ -0,0 +1,248 @@
|
|||||||
|
#include "tool.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Combined advection (lopsided) + KO dissipation (kodis).
|
||||||
|
* Uses one shared symmetry_bd buffer per call.
|
||||||
|
*/
|
||||||
|
void lopsided_kodis(const int ex[3],
|
||||||
|
const double *X, const double *Y, const double *Z,
|
||||||
|
const double *f, double *f_rhs,
|
||||||
|
const double *Sfx, const double *Sfy, const double *Sfz,
|
||||||
|
int Symmetry, const double SoA[3], double eps)
|
||||||
|
{
|
||||||
|
const double ZEO = 0.0, ONE = 1.0, F3 = 3.0;
|
||||||
|
const double F6 = 6.0, F18 = 18.0;
|
||||||
|
const double F12 = 12.0, F10 = 10.0, EIT = 8.0;
|
||||||
|
const double SIX = 6.0, FIT = 15.0, TWT = 20.0;
|
||||||
|
const double cof = 64.0; // 2^6
|
||||||
|
|
||||||
|
const int NO_SYMM = 0, EQ_SYMM = 1;
|
||||||
|
|
||||||
|
const int ex1 = ex[0], ex2 = ex[1], ex3 = ex[2];
|
||||||
|
|
||||||
|
const double dX = X[1] - X[0];
|
||||||
|
const double dY = Y[1] - Y[0];
|
||||||
|
const double dZ = Z[1] - Z[0];
|
||||||
|
|
||||||
|
const double d12dx = ONE / F12 / dX;
|
||||||
|
const double d12dy = ONE / F12 / dY;
|
||||||
|
const double d12dz = ONE / F12 / dZ;
|
||||||
|
|
||||||
|
const int imaxF = ex1;
|
||||||
|
const int jmaxF = ex2;
|
||||||
|
const int kmaxF = ex3;
|
||||||
|
|
||||||
|
int iminF = 1, jminF = 1, kminF = 1;
|
||||||
|
if (Symmetry > NO_SYMM && fabs(Z[0]) < dZ) kminF = -2;
|
||||||
|
if (Symmetry > EQ_SYMM && fabs(X[0]) < dX) iminF = -2;
|
||||||
|
if (Symmetry > EQ_SYMM && fabs(Y[0]) < dY) jminF = -2;
|
||||||
|
|
||||||
|
// fh for Fortran-style domain (-2:ex1,-2:ex2,-2:ex3)
|
||||||
|
const size_t nx = (size_t)ex1 + 3;
|
||||||
|
const size_t ny = (size_t)ex2 + 3;
|
||||||
|
const size_t nz = (size_t)ex3 + 3;
|
||||||
|
const size_t fh_size = nx * ny * nz;
|
||||||
|
|
||||||
|
double *fh = (double*)malloc(fh_size * sizeof(double));
|
||||||
|
if (!fh) return;
|
||||||
|
|
||||||
|
symmetry_bd(3, ex, f, fh, SoA);
|
||||||
|
|
||||||
|
// Advection (same stencil logic as lopsided_c.C)
|
||||||
|
for (int k0 = 0; k0 <= ex3 - 2; ++k0) {
|
||||||
|
const int kF = k0 + 1;
|
||||||
|
for (int j0 = 0; j0 <= ex2 - 2; ++j0) {
|
||||||
|
const int jF = j0 + 1;
|
||||||
|
for (int i0 = 0; i0 <= ex1 - 2; ++i0) {
|
||||||
|
const int iF = i0 + 1;
|
||||||
|
const size_t p = idx_ex(i0, j0, k0, ex);
|
||||||
|
|
||||||
|
const double sfx = Sfx[p];
|
||||||
|
if (sfx > ZEO) {
|
||||||
|
if (i0 <= ex1 - 4) {
|
||||||
|
f_rhs[p] += sfx * d12dx *
|
||||||
|
(-F3 * fh[idx_fh_F(iF - 1, jF, kF, ex)]
|
||||||
|
-F10 * fh[idx_fh_F(iF , jF, kF, ex)]
|
||||||
|
+F18 * fh[idx_fh_F(iF + 1, jF, kF, ex)]
|
||||||
|
-F6 * fh[idx_fh_F(iF + 2, jF, kF, ex)]
|
||||||
|
+ fh[idx_fh_F(iF + 3, jF, kF, ex)]);
|
||||||
|
} else if (i0 <= ex1 - 3) {
|
||||||
|
f_rhs[p] += sfx * d12dx *
|
||||||
|
( fh[idx_fh_F(iF - 2, jF, kF, ex)]
|
||||||
|
-EIT * fh[idx_fh_F(iF - 1, jF, kF, ex)]
|
||||||
|
+EIT * fh[idx_fh_F(iF + 1, jF, kF, ex)]
|
||||||
|
- fh[idx_fh_F(iF + 2, jF, kF, ex)]);
|
||||||
|
} else if (i0 <= ex1 - 2) {
|
||||||
|
f_rhs[p] -= sfx * d12dx *
|
||||||
|
(-F3 * fh[idx_fh_F(iF + 1, jF, kF, ex)]
|
||||||
|
-F10 * fh[idx_fh_F(iF , jF, kF, ex)]
|
||||||
|
+F18 * fh[idx_fh_F(iF - 1, jF, kF, ex)]
|
||||||
|
-F6 * fh[idx_fh_F(iF - 2, jF, kF, ex)]
|
||||||
|
+ fh[idx_fh_F(iF - 3, jF, kF, ex)]);
|
||||||
|
}
|
||||||
|
} else if (sfx < ZEO) {
|
||||||
|
if ((i0 - 2) >= iminF) {
|
||||||
|
f_rhs[p] -= sfx * d12dx *
|
||||||
|
(-F3 * fh[idx_fh_F(iF + 1, jF, kF, ex)]
|
||||||
|
-F10 * fh[idx_fh_F(iF , jF, kF, ex)]
|
||||||
|
+F18 * fh[idx_fh_F(iF - 1, jF, kF, ex)]
|
||||||
|
-F6 * fh[idx_fh_F(iF - 2, jF, kF, ex)]
|
||||||
|
+ fh[idx_fh_F(iF - 3, jF, kF, ex)]);
|
||||||
|
} else if ((i0 - 1) >= iminF) {
|
||||||
|
f_rhs[p] += sfx * d12dx *
|
||||||
|
( fh[idx_fh_F(iF - 2, jF, kF, ex)]
|
||||||
|
-EIT * fh[idx_fh_F(iF - 1, jF, kF, ex)]
|
||||||
|
+EIT * fh[idx_fh_F(iF + 1, jF, kF, ex)]
|
||||||
|
- fh[idx_fh_F(iF + 2, jF, kF, ex)]);
|
||||||
|
} else if (i0 >= iminF) {
|
||||||
|
f_rhs[p] += sfx * d12dx *
|
||||||
|
(-F3 * fh[idx_fh_F(iF - 1, jF, kF, ex)]
|
||||||
|
-F10 * fh[idx_fh_F(iF , jF, kF, ex)]
|
||||||
|
+F18 * fh[idx_fh_F(iF + 1, jF, kF, ex)]
|
||||||
|
-F6 * fh[idx_fh_F(iF + 2, jF, kF, ex)]
|
||||||
|
+ fh[idx_fh_F(iF + 3, jF, kF, ex)]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const double sfy = Sfy[p];
|
||||||
|
if (sfy > ZEO) {
|
||||||
|
if (j0 <= ex2 - 4) {
|
||||||
|
f_rhs[p] += sfy * d12dy *
|
||||||
|
(-F3 * fh[idx_fh_F(iF, jF - 1, kF, ex)]
|
||||||
|
-F10 * fh[idx_fh_F(iF, jF , kF, ex)]
|
||||||
|
+F18 * fh[idx_fh_F(iF, jF + 1, kF, ex)]
|
||||||
|
-F6 * fh[idx_fh_F(iF, jF + 2, kF, ex)]
|
||||||
|
+ fh[idx_fh_F(iF, jF + 3, kF, ex)]);
|
||||||
|
} else if (j0 <= ex2 - 3) {
|
||||||
|
f_rhs[p] += sfy * d12dy *
|
||||||
|
( fh[idx_fh_F(iF, jF - 2, kF, ex)]
|
||||||
|
-EIT * fh[idx_fh_F(iF, jF - 1, kF, ex)]
|
||||||
|
+EIT * fh[idx_fh_F(iF, jF + 1, kF, ex)]
|
||||||
|
- fh[idx_fh_F(iF, jF + 2, kF, ex)]);
|
||||||
|
} else if (j0 <= ex2 - 2) {
|
||||||
|
f_rhs[p] -= sfy * d12dy *
|
||||||
|
(-F3 * fh[idx_fh_F(iF, jF + 1, kF, ex)]
|
||||||
|
-F10 * fh[idx_fh_F(iF, jF , kF, ex)]
|
||||||
|
+F18 * fh[idx_fh_F(iF, jF - 1, kF, ex)]
|
||||||
|
-F6 * fh[idx_fh_F(iF, jF - 2, kF, ex)]
|
||||||
|
+ fh[idx_fh_F(iF, jF - 3, kF, ex)]);
|
||||||
|
}
|
||||||
|
} else if (sfy < ZEO) {
|
||||||
|
if ((j0 - 2) >= jminF) {
|
||||||
|
f_rhs[p] -= sfy * d12dy *
|
||||||
|
(-F3 * fh[idx_fh_F(iF, jF + 1, kF, ex)]
|
||||||
|
-F10 * fh[idx_fh_F(iF, jF , kF, ex)]
|
||||||
|
+F18 * fh[idx_fh_F(iF, jF - 1, kF, ex)]
|
||||||
|
-F6 * fh[idx_fh_F(iF, jF - 2, kF, ex)]
|
||||||
|
+ fh[idx_fh_F(iF, jF - 3, kF, ex)]);
|
||||||
|
} else if ((j0 - 1) >= jminF) {
|
||||||
|
f_rhs[p] += sfy * d12dy *
|
||||||
|
( fh[idx_fh_F(iF, jF - 2, kF, ex)]
|
||||||
|
-EIT * fh[idx_fh_F(iF, jF - 1, kF, ex)]
|
||||||
|
+EIT * fh[idx_fh_F(iF, jF + 1, kF, ex)]
|
||||||
|
- fh[idx_fh_F(iF, jF + 2, kF, ex)]);
|
||||||
|
} else if (j0 >= jminF) {
|
||||||
|
f_rhs[p] += sfy * d12dy *
|
||||||
|
(-F3 * fh[idx_fh_F(iF, jF - 1, kF, ex)]
|
||||||
|
-F10 * fh[idx_fh_F(iF, jF , kF, ex)]
|
||||||
|
+F18 * fh[idx_fh_F(iF, jF + 1, kF, ex)]
|
||||||
|
-F6 * fh[idx_fh_F(iF, jF + 2, kF, ex)]
|
||||||
|
+ fh[idx_fh_F(iF, jF + 3, kF, ex)]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const double sfz = Sfz[p];
|
||||||
|
if (sfz > ZEO) {
|
||||||
|
if (k0 <= ex3 - 4) {
|
||||||
|
f_rhs[p] += sfz * d12dz *
|
||||||
|
(-F3 * fh[idx_fh_F(iF, jF, kF - 1, ex)]
|
||||||
|
-F10 * fh[idx_fh_F(iF, jF, kF , ex)]
|
||||||
|
+F18 * fh[idx_fh_F(iF, jF, kF + 1, ex)]
|
||||||
|
-F6 * fh[idx_fh_F(iF, jF, kF + 2, ex)]
|
||||||
|
+ fh[idx_fh_F(iF, jF, kF + 3, ex)]);
|
||||||
|
} else if (k0 <= ex3 - 3) {
|
||||||
|
f_rhs[p] += sfz * d12dz *
|
||||||
|
( fh[idx_fh_F(iF, jF, kF - 2, ex)]
|
||||||
|
-EIT * fh[idx_fh_F(iF, jF, kF - 1, ex)]
|
||||||
|
+EIT * fh[idx_fh_F(iF, jF, kF + 1, ex)]
|
||||||
|
- fh[idx_fh_F(iF, jF, kF + 2, ex)]);
|
||||||
|
} else if (k0 <= ex3 - 2) {
|
||||||
|
f_rhs[p] -= sfz * d12dz *
|
||||||
|
(-F3 * fh[idx_fh_F(iF, jF, kF + 1, ex)]
|
||||||
|
-F10 * fh[idx_fh_F(iF, jF, kF , ex)]
|
||||||
|
+F18 * fh[idx_fh_F(iF, jF, kF - 1, ex)]
|
||||||
|
-F6 * fh[idx_fh_F(iF, jF, kF - 2, ex)]
|
||||||
|
+ fh[idx_fh_F(iF, jF, kF - 3, ex)]);
|
||||||
|
}
|
||||||
|
} else if (sfz < ZEO) {
|
||||||
|
if ((k0 - 2) >= kminF) {
|
||||||
|
f_rhs[p] -= sfz * d12dz *
|
||||||
|
(-F3 * fh[idx_fh_F(iF, jF, kF + 1, ex)]
|
||||||
|
-F10 * fh[idx_fh_F(iF, jF, kF , ex)]
|
||||||
|
+F18 * fh[idx_fh_F(iF, jF, kF - 1, ex)]
|
||||||
|
-F6 * fh[idx_fh_F(iF, jF, kF - 2, ex)]
|
||||||
|
+ fh[idx_fh_F(iF, jF, kF - 3, ex)]);
|
||||||
|
} else if ((k0 - 1) >= kminF) {
|
||||||
|
f_rhs[p] += sfz * d12dz *
|
||||||
|
( fh[idx_fh_F(iF, jF, kF - 2, ex)]
|
||||||
|
-EIT * fh[idx_fh_F(iF, jF, kF - 1, ex)]
|
||||||
|
+EIT * fh[idx_fh_F(iF, jF, kF + 1, ex)]
|
||||||
|
- fh[idx_fh_F(iF, jF, kF + 2, ex)]);
|
||||||
|
} else if (k0 >= kminF) {
|
||||||
|
f_rhs[p] += sfz * d12dz *
|
||||||
|
(-F3 * fh[idx_fh_F(iF, jF, kF - 1, ex)]
|
||||||
|
-F10 * fh[idx_fh_F(iF, jF, kF , ex)]
|
||||||
|
+F18 * fh[idx_fh_F(iF, jF, kF + 1, ex)]
|
||||||
|
-F6 * fh[idx_fh_F(iF, jF, kF + 2, ex)]
|
||||||
|
+ fh[idx_fh_F(iF, jF, kF + 3, ex)]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// KO dissipation (same domain restriction as kodiss_c.C)
|
||||||
|
if (eps > ZEO) {
|
||||||
|
const int i0_lo = (iminF + 2 > 0) ? iminF + 2 : 0;
|
||||||
|
const int j0_lo = (jminF + 2 > 0) ? jminF + 2 : 0;
|
||||||
|
const int k0_lo = (kminF + 2 > 0) ? kminF + 2 : 0;
|
||||||
|
const int i0_hi = imaxF - 4; // inclusive
|
||||||
|
const int j0_hi = jmaxF - 4;
|
||||||
|
const int k0_hi = kmaxF - 4;
|
||||||
|
|
||||||
|
if (!(i0_lo > i0_hi || j0_lo > j0_hi || k0_lo > k0_hi)) {
|
||||||
|
for (int k0 = k0_lo; k0 <= k0_hi; ++k0) {
|
||||||
|
const int kF = k0 + 1;
|
||||||
|
for (int j0 = j0_lo; j0 <= j0_hi; ++j0) {
|
||||||
|
const int jF = j0 + 1;
|
||||||
|
for (int i0 = i0_lo; i0 <= i0_hi; ++i0) {
|
||||||
|
const int iF = i0 + 1;
|
||||||
|
const size_t p = idx_ex(i0, j0, k0, ex);
|
||||||
|
|
||||||
|
const double Dx_term =
|
||||||
|
((fh[idx_fh_F(iF - 3, jF, kF, ex)] + fh[idx_fh_F(iF + 3, jF, kF, ex)]) -
|
||||||
|
SIX * (fh[idx_fh_F(iF - 2, jF, kF, ex)] + fh[idx_fh_F(iF + 2, jF, kF, ex)]) +
|
||||||
|
FIT * (fh[idx_fh_F(iF - 1, jF, kF, ex)] + fh[idx_fh_F(iF + 1, jF, kF, ex)]) -
|
||||||
|
TWT * fh[idx_fh_F(iF, jF, kF, ex)]) / dX;
|
||||||
|
|
||||||
|
const double Dy_term =
|
||||||
|
((fh[idx_fh_F(iF, jF - 3, kF, ex)] + fh[idx_fh_F(iF, jF + 3, kF, ex)]) -
|
||||||
|
SIX * (fh[idx_fh_F(iF, jF - 2, kF, ex)] + fh[idx_fh_F(iF, jF + 2, kF, ex)]) +
|
||||||
|
FIT * (fh[idx_fh_F(iF, jF - 1, kF, ex)] + fh[idx_fh_F(iF, jF + 1, kF, ex)]) -
|
||||||
|
TWT * fh[idx_fh_F(iF, jF, kF, ex)]) / dY;
|
||||||
|
|
||||||
|
const double Dz_term =
|
||||||
|
((fh[idx_fh_F(iF, jF, kF - 3, ex)] + fh[idx_fh_F(iF, jF, kF + 3, ex)]) -
|
||||||
|
SIX * (fh[idx_fh_F(iF, jF, kF - 2, ex)] + fh[idx_fh_F(iF, jF, kF + 2, ex)]) +
|
||||||
|
FIT * (fh[idx_fh_F(iF, jF, kF - 1, ex)] + fh[idx_fh_F(iF, jF, kF + 1, ex)]) -
|
||||||
|
TWT * fh[idx_fh_F(iF, jF, kF, ex)]) / dZ;
|
||||||
|
|
||||||
|
f_rhs[p] += (eps / cof) * (Dx_term + Dy_term + Dz_term);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free(fh);
|
||||||
|
}
|
||||||
@@ -1,27 +1,35 @@
|
|||||||
|
|
||||||
|
|
||||||
include makefile.inc
|
include makefile.inc
|
||||||
|
|
||||||
## ABE build flags selected by PGO_MODE (set in makefile.inc, default: opt)
|
## polint(ordn=6) kernel selector:
|
||||||
## make -> opt (PGO-guided, maximum performance)
|
## 1 (default): barycentric fast path
|
||||||
## make PGO_MODE=instrument -> instrument (Phase 1: collect fresh profile data)
|
## 0 : fallback to Neville path
|
||||||
PROFDATA = /home/$(shell whoami)/AMSS-NCKU/pgo_profile/default.profdata
|
POLINT6_USE_BARY ?= 1
|
||||||
|
POLINT6_FLAG = -DPOLINT6_USE_BARYCENTRIC=$(POLINT6_USE_BARY)
|
||||||
|
|
||||||
|
## ABE build flags selected by PGO_MODE (set in makefile.inc, default: opt)
|
||||||
|
## make -> opt (PGO-guided, maximum performance)
|
||||||
|
## make PGO_MODE=instrument -> instrument (Phase 1: collect fresh profile data)
|
||||||
|
PROFDATA = /home/$(shell whoami)/AMSS-NCKU/pgo_profile/default.profdata
|
||||||
|
|
||||||
ifeq ($(PGO_MODE),instrument)
|
ifeq ($(PGO_MODE),instrument)
|
||||||
## Phase 1: instrumentation — omit -ipo/-fp-model fast=2 for faster build and numerical stability
|
## Phase 1: instrumentation — omit -ipo/-fp-model fast=2 for faster build and numerical stability
|
||||||
CXXAPPFLAGS = -O3 -xHost -fma -fprofile-instr-generate -ipo \
|
CXXAPPFLAGS = -O3 -xHost -fma -fprofile-instr-generate -ipo \
|
||||||
-Dfortran3 -Dnewc -I${MKLROOT}/include $(INTERP_LB_FLAGS)
|
-Dfortran3 -Dnewc -I${MKLROOT}/include $(INTERP_LB_FLAGS)
|
||||||
f90appflags = -O3 -xHost -fma -fprofile-instr-generate -ipo \
|
f90appflags = -O3 -xHost -fma -fprofile-instr-generate -ipo \
|
||||||
-align array64byte -fpp -I${MKLROOT}/include
|
-align array64byte -fpp -I${MKLROOT}/include $(POLINT6_FLAG)
|
||||||
else
|
else
|
||||||
## opt (default): maximum performance with PGO profile data
|
## opt (default): maximum performance with PGO profile data -fprofile-instr-use=$(PROFDATA) \
|
||||||
CXXAPPFLAGS = -O3 -xHost -fp-model fast=2 -fma -ipo \
|
## PGO has been turned off, now tested and found to be negative optimization
|
||||||
-fprofile-instr-use=$(PROFDATA) \
|
## INTERP_LB_FLAGS has been turned off too, now tested and found to be negative optimization
|
||||||
-Dfortran3 -Dnewc -I${MKLROOT}/include $(INTERP_LB_FLAGS)
|
|
||||||
f90appflags = -O3 -xHost -fp-model fast=2 -fma -ipo \
|
|
||||||
-fprofile-instr-use=$(PROFDATA) \
|
CXXAPPFLAGS = -O3 -xHost -fp-model fast=2 -fma -ipo \
|
||||||
-align array64byte -fpp -I${MKLROOT}/include
|
-Dfortran3 -Dnewc -I${MKLROOT}/include $(INTERP_LB_FLAGS)
|
||||||
endif
|
f90appflags = -O3 -xHost -fp-model fast=2 -fma -ipo \
|
||||||
|
-align array64byte -fpp -I${MKLROOT}/include $(POLINT6_FLAG)
|
||||||
|
endif
|
||||||
|
|
||||||
.SUFFIXES: .o .f90 .C .for .cu
|
.SUFFIXES: .o .f90 .C .for .cu
|
||||||
|
|
||||||
@@ -50,11 +58,14 @@ fdderivs_c.o: fdderivs_c.C
|
|||||||
kodiss_c.o: kodiss_c.C
|
kodiss_c.o: kodiss_c.C
|
||||||
${CXX} $(CXXAPPFLAGS) -c $< $(filein) -o $@
|
${CXX} $(CXXAPPFLAGS) -c $< $(filein) -o $@
|
||||||
|
|
||||||
lopsided_c.o: lopsided_c.C
|
lopsided_c.o: lopsided_c.C
|
||||||
${CXX} $(CXXAPPFLAGS) -c $< $(filein) -o $@
|
${CXX} $(CXXAPPFLAGS) -c $< $(filein) -o $@
|
||||||
|
|
||||||
interp_lb_profile.o: interp_lb_profile.C interp_lb_profile.h
|
lopsided_kodis_c.o: lopsided_kodis_c.C
|
||||||
${CXX} $(CXXAPPFLAGS) -c $< $(filein) -o $@
|
${CXX} $(CXXAPPFLAGS) -c $< $(filein) -o $@
|
||||||
|
|
||||||
|
#interp_lb_profile.o: interp_lb_profile.C interp_lb_profile.h
|
||||||
|
# ${CXX} $(CXXAPPFLAGS) -c $< $(filein) -o $@
|
||||||
|
|
||||||
## TwoPunctureABE uses fixed optimal flags with its own PGO profile, independent of CXXAPPFLAGS
|
## TwoPunctureABE uses fixed optimal flags with its own PGO profile, independent of CXXAPPFLAGS
|
||||||
TP_PROFDATA = /home/$(shell whoami)/AMSS-NCKU/pgo_profile/TwoPunctureABE.profdata
|
TP_PROFDATA = /home/$(shell whoami)/AMSS-NCKU/pgo_profile/TwoPunctureABE.profdata
|
||||||
@@ -71,13 +82,21 @@ TwoPunctureABE.o: TwoPunctureABE.C
|
|||||||
# Input files
|
# Input files
|
||||||
|
|
||||||
## Kernel implementation switch (set USE_CXX_KERNELS=0 to fall back to Fortran)
|
## Kernel implementation switch (set USE_CXX_KERNELS=0 to fall back to Fortran)
|
||||||
ifeq ($(USE_CXX_KERNELS),0)
|
ifeq ($(USE_CXX_KERNELS),0)
|
||||||
# Fortran mode: no C rewrite files; bssn_rhs.o is included via F90FILES below
|
# Fortran mode: no C rewrite files; bssn_rhs.o is included via F90FILES below
|
||||||
CFILES =
|
CFILES =
|
||||||
else
|
else
|
||||||
# C++ mode (default): C rewrite of bssn_rhs and helper kernels
|
# C++ mode (default): C rewrite of bssn_rhs and helper kernels
|
||||||
CFILES = bssn_rhs_c.o fderivs_c.o fdderivs_c.o kodiss_c.o lopsided_c.o
|
CFILES = bssn_rhs_c.o fderivs_c.o fdderivs_c.o kodiss_c.o lopsided_c.o lopsided_kodis_c.o
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
## RK4 kernel switch (independent from USE_CXX_KERNELS)
|
||||||
|
ifeq ($(USE_CXX_RK4),1)
|
||||||
|
CFILES += rungekutta4_rout_c.o
|
||||||
|
RK4_F90_OBJ =
|
||||||
|
else
|
||||||
|
RK4_F90_OBJ = rungekutta4_rout.o
|
||||||
|
endif
|
||||||
|
|
||||||
C++FILES = ABE.o Ansorg.o Block.o misc.o monitor.o Parallel.o MPatch.o var.o\
|
C++FILES = ABE.o Ansorg.o Block.o misc.o monitor.o Parallel.o MPatch.o var.o\
|
||||||
cgh.o bssn_class.o surface_integral.o ShellPatch.o\
|
cgh.o bssn_class.o surface_integral.o ShellPatch.o\
|
||||||
@@ -94,12 +113,12 @@ C++FILES_GPU = ABE.o Ansorg.o Block.o misc.o monitor.o Parallel.o MPatch.o var.o
|
|||||||
NullShellPatch2_Evo.o \
|
NullShellPatch2_Evo.o \
|
||||||
bssn_gpu_class.o bssn_step_gpu.o bssn_macro.o writefile_f.o
|
bssn_gpu_class.o bssn_step_gpu.o bssn_macro.o writefile_f.o
|
||||||
|
|
||||||
F90FILES_BASE = enforce_algebra.o fmisc.o initial_puncture.o prolongrestrict.o\
|
F90FILES_BASE = enforce_algebra.o fmisc.o initial_puncture.o prolongrestrict.o\
|
||||||
prolongrestrict_cell.o prolongrestrict_vertex.o\
|
prolongrestrict_cell.o prolongrestrict_vertex.o\
|
||||||
rungekutta4_rout.o diff_new.o kodiss.o kodiss_sh.o\
|
$(RK4_F90_OBJ) diff_new.o kodiss.o kodiss_sh.o\
|
||||||
lopsidediff.o sommerfeld_rout.o getnp4.o diff_new_sh.o\
|
lopsidediff.o sommerfeld_rout.o getnp4.o diff_new_sh.o\
|
||||||
shellfunctions.o bssn_rhs_ss.o Set_Rho_ADM.o\
|
shellfunctions.o bssn_rhs_ss.o Set_Rho_ADM.o\
|
||||||
getnp4EScalar.o bssnEScalar_rhs.o bssn_constraint.o ricci_gamma.o\
|
getnp4EScalar.o bssnEScalar_rhs.o bssn_constraint.o ricci_gamma.o\
|
||||||
fadmquantites_bssn.o Z4c_rhs.o Z4c_rhs_ss.o point_diff_new_sh.o\
|
fadmquantites_bssn.o Z4c_rhs.o Z4c_rhs_ss.o point_diff_new_sh.o\
|
||||||
cpbc.o getnp4old.o NullEvol.o initial_null.o initial_maxwell.o\
|
cpbc.o getnp4old.o NullEvol.o initial_null.o initial_maxwell.o\
|
||||||
getnpem2.o empart.o NullNews.o fourdcurvature.o\
|
getnpem2.o empart.o NullNews.o fourdcurvature.o\
|
||||||
|
|||||||
@@ -10,6 +10,20 @@ filein = -I/usr/include/ -I${MKLROOT}/include
|
|||||||
## Added -lifcore for Intel Fortran runtime and -limf for Intel math library
|
## Added -lifcore for Intel Fortran runtime and -limf for Intel math library
|
||||||
LDLIBS = -L${MKLROOT}/lib -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lifcore -limf -lpthread -lm -ldl -liomp5
|
LDLIBS = -L${MKLROOT}/lib -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lifcore -limf -lpthread -lm -ldl -liomp5
|
||||||
|
|
||||||
|
## Memory allocator switch
|
||||||
|
## 1 (default) : link Intel oneTBB allocator (libtbbmalloc)
|
||||||
|
## 0 : use system default allocator (ptmalloc)
|
||||||
|
USE_TBBMALLOC ?= 1
|
||||||
|
TBBMALLOC_SO ?= /home/intel/oneapi/2025.3/lib/libtbbmalloc.so
|
||||||
|
ifneq ($(wildcard $(TBBMALLOC_SO)),)
|
||||||
|
TBBMALLOC_LIBS = -Wl,--no-as-needed $(TBBMALLOC_SO) -Wl,--as-needed
|
||||||
|
else
|
||||||
|
TBBMALLOC_LIBS = -Wl,--no-as-needed -ltbbmalloc -Wl,--as-needed
|
||||||
|
endif
|
||||||
|
ifeq ($(USE_TBBMALLOC),1)
|
||||||
|
LDLIBS := $(TBBMALLOC_LIBS) $(LDLIBS)
|
||||||
|
endif
|
||||||
|
|
||||||
## PGO build mode switch (ABE only; TwoPunctureABE always uses opt flags)
|
## PGO build mode switch (ABE only; TwoPunctureABE always uses opt flags)
|
||||||
## opt : (default) maximum performance with PGO profile-guided optimization
|
## opt : (default) maximum performance with PGO profile-guided optimization
|
||||||
## instrument : PGO Phase 1 instrumentation to collect fresh profile data
|
## instrument : PGO Phase 1 instrumentation to collect fresh profile data
|
||||||
@@ -32,12 +46,18 @@ endif
|
|||||||
## Kernel implementation switch
|
## Kernel implementation switch
|
||||||
## 1 (default) : use C++ rewrite of bssn_rhs and helper kernels (faster)
|
## 1 (default) : use C++ rewrite of bssn_rhs and helper kernels (faster)
|
||||||
## 0 : fall back to original Fortran kernels
|
## 0 : fall back to original Fortran kernels
|
||||||
USE_CXX_KERNELS ?= 1
|
USE_CXX_KERNELS ?= 0
|
||||||
|
|
||||||
|
## RK4 kernel implementation switch
|
||||||
|
## 1 (default) : use C/C++ rewrite of rungekutta4_rout (for optimization experiments)
|
||||||
|
## 0 : use original Fortran rungekutta4_rout.o
|
||||||
|
USE_CXX_RK4 ?= 0
|
||||||
|
|
||||||
f90 = ifx
|
f90 = ifx
|
||||||
f77 = ifx
|
f77 = ifx
|
||||||
CXX = icpx
|
CXX = icpx
|
||||||
CC = icx
|
CC = icx
|
||||||
CLINKER = mpiicpx
|
CLINKER = mpiicpx
|
||||||
|
|
||||||
Cu = nvcc
|
Cu = nvcc
|
||||||
CUDA_LIB_PATH = -L/usr/lib/cuda/lib64 -I/usr/include -I/usr/lib/cuda/include
|
CUDA_LIB_PATH = -L/usr/lib/cuda/lib64 -I/usr/include -I/usr/lib/cuda/include
|
||||||
|
|||||||
@@ -1934,18 +1934,35 @@
|
|||||||
! when if=1 -> ic=0, this is different to vertex center grid
|
! when if=1 -> ic=0, this is different to vertex center grid
|
||||||
real*8, dimension(-2:extc(1),-2:extc(2),-2:extc(3)) :: funcc
|
real*8, dimension(-2:extc(1),-2:extc(2),-2:extc(3)) :: funcc
|
||||||
integer,dimension(3) :: cxI
|
integer,dimension(3) :: cxI
|
||||||
integer :: i,j,k,ii,jj,kk
|
integer :: i,j,k,ii,jj,kk,px,py,pz
|
||||||
real*8, dimension(6,6) :: tmp2
|
real*8, dimension(6,6) :: tmp2
|
||||||
real*8, dimension(6) :: tmp1
|
real*8, dimension(6) :: tmp1
|
||||||
|
integer, dimension(extf(1)) :: cix
|
||||||
|
integer, dimension(extf(2)) :: ciy
|
||||||
|
integer, dimension(extf(3)) :: ciz
|
||||||
|
integer, dimension(extf(1)) :: pix
|
||||||
|
integer, dimension(extf(2)) :: piy
|
||||||
|
integer, dimension(extf(3)) :: piz
|
||||||
|
|
||||||
real*8, parameter :: C1=7.7d1/8.192d3,C2=-6.93d2/8.192d3,C3=3.465d3/4.096d3
|
real*8, parameter :: C1=7.7d1/8.192d3,C2=-6.93d2/8.192d3,C3=3.465d3/4.096d3
|
||||||
real*8, parameter :: C6=6.3d1/8.192d3,C5=-4.95d2/8.192d3,C4=1.155d3/4.096d3
|
real*8, parameter :: C6=6.3d1/8.192d3,C5=-4.95d2/8.192d3,C4=1.155d3/4.096d3
|
||||||
|
real*8, dimension(6,2), parameter :: WC = reshape((/&
|
||||||
|
C1,C2,C3,C4,C5,C6,&
|
||||||
|
C6,C5,C4,C3,C2,C1/), (/6,2/))
|
||||||
|
|
||||||
integer::imini,imaxi,jmini,jmaxi,kmini,kmaxi
|
integer::imini,imaxi,jmini,jmaxi,kmini,kmaxi
|
||||||
integer::imino,imaxo,jmino,jmaxo,kmino,kmaxo
|
integer::imino,imaxo,jmino,jmaxo,kmino,kmaxo
|
||||||
|
integer::maxcx,maxcy,maxcz
|
||||||
|
|
||||||
real*8,dimension(3) :: CD,FD
|
real*8,dimension(3) :: CD,FD
|
||||||
|
real*8 :: tmp_yz(extc(1), 6) ! 存储整条 X 线上 6 个 Y 轴偏置的 Z 向插值结果
|
||||||
|
real*8 :: tmp_xyz_line(-2:extc(1)) ! 包含 X 向 6 点模板访问所需下界
|
||||||
|
real*8 :: v1, v2, v3, v4, v5, v6
|
||||||
|
integer :: ic, jc, kc, ix_offset,ix,iy,iz,jc_min,jc_max,ic_min,ic_max,kc_min,kc_max
|
||||||
|
integer :: i_lo, i_hi, j_lo, j_hi, k_lo, k_hi
|
||||||
|
logical :: need_full_symmetry
|
||||||
|
real*8 :: res_line
|
||||||
|
real*8 :: tmp_z_slab(-2:extc(1), -2:extc(2)) ! 包含 Y/X 向模板访问所需下界
|
||||||
if(wei.ne.3)then
|
if(wei.ne.3)then
|
||||||
write(*,*)"prolongrestrict.f90::prolong3: this routine only surport 3 dimension"
|
write(*,*)"prolongrestrict.f90::prolong3: this routine only surport 3 dimension"
|
||||||
write(*,*)"dim = ",wei
|
write(*,*)"dim = ",wei
|
||||||
@@ -2020,145 +2037,140 @@
|
|||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
|
||||||
call symmetry_bd(3,extc,func,funcc,SoA)
|
do i = imino,imaxo
|
||||||
|
ii = i + lbf(1) - 1
|
||||||
!~~~~~~> prolongation start...
|
cix(i) = ii/2 - lbc(1) + 1
|
||||||
|
if(ii/2*2 == ii)then
|
||||||
|
pix(i) = 1
|
||||||
|
else
|
||||||
|
pix(i) = 2
|
||||||
|
endif
|
||||||
|
enddo
|
||||||
|
do j = jmino,jmaxo
|
||||||
|
jj = j + lbf(2) - 1
|
||||||
|
ciy(j) = jj/2 - lbc(2) + 1
|
||||||
|
if(jj/2*2 == jj)then
|
||||||
|
piy(j) = 1
|
||||||
|
else
|
||||||
|
piy(j) = 2
|
||||||
|
endif
|
||||||
|
enddo
|
||||||
do k = kmino,kmaxo
|
do k = kmino,kmaxo
|
||||||
do j = jmino,jmaxo
|
kk = k + lbf(3) - 1
|
||||||
do i = imino,imaxo
|
ciz(k) = kk/2 - lbc(3) + 1
|
||||||
cxI(1) = i
|
if(kk/2*2 == kk)then
|
||||||
cxI(2) = j
|
piz(k) = 1
|
||||||
cxI(3) = k
|
else
|
||||||
! change to coarse level reference
|
piz(k) = 2
|
||||||
!|---*--- ---*--- ---*--- ---*--- ---*--- ---*--- ---*--- ---*---|
|
endif
|
||||||
!|=======x===============x===============x===============x=======|
|
|
||||||
cxI = (cxI+lbf-1)/2
|
|
||||||
! change to array index
|
|
||||||
cxI = cxI - lbc + 1
|
|
||||||
|
|
||||||
if(any(cxI+3 > extc)) write(*,*)"error in prolong"
|
|
||||||
ii=i+lbf(1)-1
|
|
||||||
jj=j+lbf(2)-1
|
|
||||||
kk=k+lbf(3)-1
|
|
||||||
#if 0
|
|
||||||
if(ii/2*2==ii)then
|
|
||||||
if(jj/2*2==jj)then
|
|
||||||
if(kk/2*2==kk)then
|
|
||||||
tmp2= C1*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)-2)+&
|
|
||||||
C2*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)-1)+&
|
|
||||||
C3*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3) )+&
|
|
||||||
C4*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)+1)+&
|
|
||||||
C5*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)+2)+&
|
|
||||||
C6*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)+3)
|
|
||||||
tmp1= C1*tmp2(:,1)+C2*tmp2(:,2)+C3*tmp2(:,3)+C4*tmp2(:,4)+C5*tmp2(:,5)+C6*tmp2(:,6)
|
|
||||||
funf(i,j,k)= C1*tmp1(1)+C2*tmp1(2)+C3*tmp1(3)+C4*tmp1(4)+C5*tmp1(5)+C6*tmp1(6)
|
|
||||||
else
|
|
||||||
tmp2= C6*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)-2)+&
|
|
||||||
C5*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)-1)+&
|
|
||||||
C4*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3) )+&
|
|
||||||
C3*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)+1)+&
|
|
||||||
C2*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)+2)+&
|
|
||||||
C1*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)+3)
|
|
||||||
tmp1= C1*tmp2(:,1)+C2*tmp2(:,2)+C3*tmp2(:,3)+C4*tmp2(:,4)+C5*tmp2(:,5)+C6*tmp2(:,6)
|
|
||||||
funf(i,j,k)= C1*tmp1(1)+C2*tmp1(2)+C3*tmp1(3)+C4*tmp1(4)+C5*tmp1(5)+C6*tmp1(6)
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
if(kk/2*2==kk)then
|
|
||||||
tmp2= C1*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)-2)+&
|
|
||||||
C2*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)-1)+&
|
|
||||||
C3*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3) )+&
|
|
||||||
C4*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)+1)+&
|
|
||||||
C5*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)+2)+&
|
|
||||||
C6*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)+3)
|
|
||||||
tmp1= C6*tmp2(:,1)+C5*tmp2(:,2)+C4*tmp2(:,3)+C3*tmp2(:,4)+C2*tmp2(:,5)+C1*tmp2(:,6)
|
|
||||||
funf(i,j,k)= C1*tmp1(1)+C2*tmp1(2)+C3*tmp1(3)+C4*tmp1(4)+C5*tmp1(5)+C6*tmp1(6)
|
|
||||||
else
|
|
||||||
tmp2= C6*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)-2)+&
|
|
||||||
C5*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)-1)+&
|
|
||||||
C4*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3) )+&
|
|
||||||
C3*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)+1)+&
|
|
||||||
C2*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)+2)+&
|
|
||||||
C1*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)+3)
|
|
||||||
tmp1= C6*tmp2(:,1)+C5*tmp2(:,2)+C4*tmp2(:,3)+C3*tmp2(:,4)+C2*tmp2(:,5)+C1*tmp2(:,6)
|
|
||||||
funf(i,j,k)= C1*tmp1(1)+C2*tmp1(2)+C3*tmp1(3)+C4*tmp1(4)+C5*tmp1(5)+C6*tmp1(6)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
if(jj/2*2==jj)then
|
|
||||||
if(kk/2*2==kk)then
|
|
||||||
tmp2= C1*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)-2)+&
|
|
||||||
C2*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)-1)+&
|
|
||||||
C3*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3) )+&
|
|
||||||
C4*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)+1)+&
|
|
||||||
C5*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)+2)+&
|
|
||||||
C6*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)+3)
|
|
||||||
tmp1= C1*tmp2(:,1)+C2*tmp2(:,2)+C3*tmp2(:,3)+C4*tmp2(:,4)+C5*tmp2(:,5)+C6*tmp2(:,6)
|
|
||||||
funf(i,j,k)= C6*tmp1(1)+C5*tmp1(2)+C4*tmp1(3)+C3*tmp1(4)+C2*tmp1(5)+C1*tmp1(6)
|
|
||||||
else
|
|
||||||
tmp2= C6*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)-2)+&
|
|
||||||
C5*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)-1)+&
|
|
||||||
C4*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3) )+&
|
|
||||||
C3*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)+1)+&
|
|
||||||
C2*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)+2)+&
|
|
||||||
C1*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)+3)
|
|
||||||
tmp1= C1*tmp2(:,1)+C2*tmp2(:,2)+C3*tmp2(:,3)+C4*tmp2(:,4)+C5*tmp2(:,5)+C6*tmp2(:,6)
|
|
||||||
funf(i,j,k)= C6*tmp1(1)+C5*tmp1(2)+C4*tmp1(3)+C3*tmp1(4)+C2*tmp1(5)+C1*tmp1(6)
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
if(kk/2*2==kk)then
|
|
||||||
tmp2= C1*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)-2)+&
|
|
||||||
C2*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)-1)+&
|
|
||||||
C3*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3) )+&
|
|
||||||
C4*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)+1)+&
|
|
||||||
C5*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)+2)+&
|
|
||||||
C6*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)+3)
|
|
||||||
tmp1= C6*tmp2(:,1)+C5*tmp2(:,2)+C4*tmp2(:,3)+C3*tmp2(:,4)+C2*tmp2(:,5)+C1*tmp2(:,6)
|
|
||||||
funf(i,j,k)= C6*tmp1(1)+C5*tmp1(2)+C4*tmp1(3)+C3*tmp1(4)+C2*tmp1(5)+C1*tmp1(6)
|
|
||||||
else
|
|
||||||
tmp2= C6*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)-2)+&
|
|
||||||
C5*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)-1)+&
|
|
||||||
C4*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3) )+&
|
|
||||||
C3*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)+1)+&
|
|
||||||
C2*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)+2)+&
|
|
||||||
C1*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)+3)
|
|
||||||
tmp1= C6*tmp2(:,1)+C5*tmp2(:,2)+C4*tmp2(:,3)+C3*tmp2(:,4)+C2*tmp2(:,5)+C1*tmp2(:,6)
|
|
||||||
funf(i,j,k)= C6*tmp1(1)+C5*tmp1(2)+C4*tmp1(3)+C3*tmp1(4)+C2*tmp1(5)+C1*tmp1(6)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
#else
|
|
||||||
if(kk/2*2==kk)then
|
|
||||||
tmp2= C1*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)-2)+&
|
|
||||||
C2*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)-1)+&
|
|
||||||
C3*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3) )+&
|
|
||||||
C4*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)+1)+&
|
|
||||||
C5*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)+2)+&
|
|
||||||
C6*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)+3)
|
|
||||||
else
|
|
||||||
tmp2= C6*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)-2)+&
|
|
||||||
C5*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)-1)+&
|
|
||||||
C4*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3) )+&
|
|
||||||
C3*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)+1)+&
|
|
||||||
C2*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)+2)+&
|
|
||||||
C1*funcc(cxI(1)-2:cxI(1)+3,cxI(2)-2:cxI(2)+3,cxI(3)+3)
|
|
||||||
endif
|
|
||||||
|
|
||||||
if(jj/2*2==jj)then
|
|
||||||
tmp1= C1*tmp2(:,1)+C2*tmp2(:,2)+C3*tmp2(:,3)+C4*tmp2(:,4)+C5*tmp2(:,5)+C6*tmp2(:,6)
|
|
||||||
else
|
|
||||||
tmp1= C6*tmp2(:,1)+C5*tmp2(:,2)+C4*tmp2(:,3)+C3*tmp2(:,4)+C2*tmp2(:,5)+C1*tmp2(:,6)
|
|
||||||
endif
|
|
||||||
|
|
||||||
if(ii/2*2==ii)then
|
|
||||||
funf(i,j,k)= C1*tmp1(1)+C2*tmp1(2)+C3*tmp1(3)+C4*tmp1(4)+C5*tmp1(5)+C6*tmp1(6)
|
|
||||||
else
|
|
||||||
funf(i,j,k)= C6*tmp1(1)+C5*tmp1(2)+C4*tmp1(3)+C3*tmp1(4)+C2*tmp1(5)+C1*tmp1(6)
|
|
||||||
endif
|
|
||||||
#endif
|
|
||||||
enddo
|
|
||||||
enddo
|
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
|
ic_min = minval(cix(imino:imaxo))
|
||||||
|
ic_max = maxval(cix(imino:imaxo))
|
||||||
|
jc_min = minval(ciy(jmino:jmaxo))
|
||||||
|
jc_max = maxval(ciy(jmino:jmaxo))
|
||||||
|
kc_min = minval(ciz(kmino:kmaxo))
|
||||||
|
kc_max = maxval(ciz(kmino:kmaxo))
|
||||||
|
|
||||||
|
maxcx = ic_max
|
||||||
|
maxcy = jc_max
|
||||||
|
maxcz = kc_max
|
||||||
|
if(maxcx+3 > extc(1) .or. maxcy+3 > extc(2) .or. maxcz+3 > extc(3))then
|
||||||
|
write(*,*)"error in prolong"
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
i_lo = ic_min - 2
|
||||||
|
i_hi = ic_max + 3
|
||||||
|
j_lo = jc_min - 2
|
||||||
|
j_hi = jc_max + 3
|
||||||
|
k_lo = kc_min - 2
|
||||||
|
k_hi = kc_max + 3
|
||||||
|
need_full_symmetry = (i_lo < 1) .or. (j_lo < 1) .or. (k_lo < 1)
|
||||||
|
if(need_full_symmetry)then
|
||||||
|
call symmetry_bd(3,extc,func,funcc,SoA)
|
||||||
|
else
|
||||||
|
funcc(i_lo:i_hi,j_lo:j_hi,k_lo:k_hi) = func(i_lo:i_hi,j_lo:j_hi,k_lo:k_hi)
|
||||||
|
endif
|
||||||
|
|
||||||
|
! 对每个 k(pz, kc 固定)预计算 Z 向插值的 2D 切片
|
||||||
|
|
||||||
|
do k = kmino, kmaxo
|
||||||
|
pz = piz(k); kc = ciz(k)
|
||||||
|
! --- Pass 1: Z 方向,只算一次 ---
|
||||||
|
do iy = jc_min-2, jc_max+3 ! 仅需的 iy 范围(对应 jc-2:jc+3)
|
||||||
|
do ii = ic_min-2, ic_max+3 ! 仅需的 ii 范围(对应 cix-2:cix+3)
|
||||||
|
tmp_z_slab(ii, iy) = sum(WC(:,pz) * funcc(ii, iy, kc-2:kc+3))
|
||||||
|
end do
|
||||||
|
end do
|
||||||
|
|
||||||
|
do j = jmino, jmaxo
|
||||||
|
py = piy(j); jc = ciy(j)
|
||||||
|
! --- Pass 2: Y 方向 ---
|
||||||
|
do ii = ic_min-2, ic_max+3
|
||||||
|
tmp_xyz_line(ii) = sum(WC(:,py) * tmp_z_slab(ii, jc-2:jc+3))
|
||||||
|
end do
|
||||||
|
! --- Pass 3: X 方向 ---
|
||||||
|
do i = imino, imaxo
|
||||||
|
funf(i,j,k) = sum(WC(:,pix(i)) * tmp_xyz_line(cix(i)-2:cix(i)+3))
|
||||||
|
end do
|
||||||
|
end do
|
||||||
|
end do
|
||||||
|
|
||||||
|
!~~~~~~> prolongation start...
|
||||||
|
#if 0
|
||||||
|
do k = kmino, kmaxo
|
||||||
|
pz = piz(k)
|
||||||
|
kc = ciz(k)
|
||||||
|
|
||||||
|
do j = jmino, jmaxo
|
||||||
|
py = piy(j)
|
||||||
|
jc = ciy(j)
|
||||||
|
|
||||||
|
! --- 步骤 1 & 2 融合:分段处理 X 轴,提升 Cache 命中率 ---
|
||||||
|
! 我们将 ii 循环逻辑重组,减少对 funcc 的跨行重复访问
|
||||||
|
do ii = 1, extc(1)
|
||||||
|
! 1. 先做 Z 方向的 6 条线插值(针对当前的 ii 和当前的 6 个 iy)
|
||||||
|
! 我们直接在这里把 Y 方向的加权也做了,省去 tmp_yz 数组
|
||||||
|
! 这样 funcc 的数据读进来后立即完成所有维度的贡献,不再写回内存
|
||||||
|
|
||||||
|
res_line = 0.0d0
|
||||||
|
do jj = 1, 6
|
||||||
|
iy = jc - 3 + jj
|
||||||
|
! 这一行代码是核心:一次性完成 Z 插值并加上 Y 的权重
|
||||||
|
! 编译器会把 WC(jj, py) 存在寄存器里
|
||||||
|
res_line = res_line + WC(jj, py) * ( &
|
||||||
|
WC(1, pz) * funcc(ii, iy, kc-2) + &
|
||||||
|
WC(2, pz) * funcc(ii, iy, kc-1) + &
|
||||||
|
WC(3, pz) * funcc(ii, iy, kc ) + &
|
||||||
|
WC(4, pz) * funcc(ii, iy, kc+1) + &
|
||||||
|
WC(5, pz) * funcc(ii, iy, kc+2) + &
|
||||||
|
WC(6, pz) * funcc(ii, iy, kc+3) )
|
||||||
|
end do
|
||||||
|
tmp_xyz_line(ii) = res_line
|
||||||
|
end do
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
! 3. 【降维:X 向】最后在最内层只处理 X 方向的 6 点加权
|
||||||
|
! 此时每个点的计算量从原来的 200+ 次乘法降到了仅 6 次
|
||||||
|
do i = imino, imaxo
|
||||||
|
px = pix(i)
|
||||||
|
ic = cix(i)
|
||||||
|
|
||||||
|
! 直接从预计算好的 line 中读取连续的 6 个点
|
||||||
|
! ic-2 到 ic+3 对应原始 6 点算子
|
||||||
|
funf(i,j,k) = WC(1,px)*tmp_xyz_line(ic-2) + &
|
||||||
|
WC(2,px)*tmp_xyz_line(ic-1) + &
|
||||||
|
WC(3,px)*tmp_xyz_line(ic ) + &
|
||||||
|
WC(4,px)*tmp_xyz_line(ic+1) + &
|
||||||
|
WC(5,px)*tmp_xyz_line(ic+2) + &
|
||||||
|
WC(6,px)*tmp_xyz_line(ic+3)
|
||||||
|
end do
|
||||||
|
end do
|
||||||
|
end do
|
||||||
|
#endif
|
||||||
return
|
return
|
||||||
|
|
||||||
end subroutine prolong3
|
end subroutine prolong3
|
||||||
@@ -2357,7 +2369,14 @@
|
|||||||
integer::imino,imaxo,jmino,jmaxo,kmino,kmaxo
|
integer::imino,imaxo,jmino,jmaxo,kmino,kmaxo
|
||||||
|
|
||||||
real*8,dimension(3) :: CD,FD
|
real*8,dimension(3) :: CD,FD
|
||||||
|
|
||||||
|
real*8 :: tmp_xz_plane(-1:extf(1), 6)
|
||||||
|
real*8 :: tmp_x_line(-1:extf(1))
|
||||||
|
integer :: fi, fj, fk, ii, jj, kk
|
||||||
|
integer :: fi_min, fi_max, ii_lo, ii_hi
|
||||||
|
integer :: fj_min, fj_max, fk_min, fk_max, jj_lo, jj_hi, kk_lo, kk_hi
|
||||||
|
logical :: need_full_symmetry
|
||||||
|
|
||||||
if(wei.ne.3)then
|
if(wei.ne.3)then
|
||||||
write(*,*)"prolongrestrict.f90::restrict3: this routine only surport 3 dimension"
|
write(*,*)"prolongrestrict.f90::restrict3: this routine only surport 3 dimension"
|
||||||
write(*,*)"dim = ",wei
|
write(*,*)"dim = ",wei
|
||||||
@@ -2436,9 +2455,86 @@
|
|||||||
stop
|
stop
|
||||||
endif
|
endif
|
||||||
|
|
||||||
call symmetry_bd(2,extf,funf,funff,SoA)
|
! 仅计算 X 向最终写回所需的窗口:
|
||||||
|
! func(i,j,k) 只访问 tmp_x_line(fi-2:fi+3)
|
||||||
|
fi_min = 2*(imino + lbc(1) - 1) - 1 - lbf(1) + 1
|
||||||
|
fi_max = 2*(imaxo + lbc(1) - 1) - 1 - lbf(1) + 1
|
||||||
|
fj_min = 2*(jmino + lbc(2) - 1) - 1 - lbf(2) + 1
|
||||||
|
fj_max = 2*(jmaxo + lbc(2) - 1) - 1 - lbf(2) + 1
|
||||||
|
fk_min = 2*(kmino + lbc(3) - 1) - 1 - lbf(3) + 1
|
||||||
|
fk_max = 2*(kmaxo + lbc(3) - 1) - 1 - lbf(3) + 1
|
||||||
|
ii_lo = fi_min - 2
|
||||||
|
ii_hi = fi_max + 3
|
||||||
|
jj_lo = fj_min - 2
|
||||||
|
jj_hi = fj_max + 3
|
||||||
|
kk_lo = fk_min - 2
|
||||||
|
kk_hi = fk_max + 3
|
||||||
|
if(ii_lo < -1 .or. ii_hi > extf(1) .or. &
|
||||||
|
jj_lo < -1 .or. jj_hi > extf(2) .or. &
|
||||||
|
kk_lo < -1 .or. kk_hi > extf(3))then
|
||||||
|
write(*,*)"restrict3: invalid stencil window"
|
||||||
|
write(*,*)"ii=",ii_lo,ii_hi," jj=",jj_lo,jj_hi," kk=",kk_lo,kk_hi
|
||||||
|
write(*,*)"extf=",extf
|
||||||
|
stop
|
||||||
|
endif
|
||||||
|
need_full_symmetry = (ii_lo < 1) .or. (jj_lo < 1) .or. (kk_lo < 1)
|
||||||
|
if(need_full_symmetry)then
|
||||||
|
call symmetry_bd(2,extf,funf,funff,SoA)
|
||||||
|
else
|
||||||
|
funff(ii_lo:ii_hi,jj_lo:jj_hi,kk_lo:kk_hi) = funf(ii_lo:ii_hi,jj_lo:jj_hi,kk_lo:kk_hi)
|
||||||
|
endif
|
||||||
|
|
||||||
!~~~~~~> restriction start...
|
!~~~~~~> restriction start...
|
||||||
|
do k = kmino, kmaxo
|
||||||
|
fk = 2*(k + lbc(3) - 1) - 1 - lbf(3) + 1
|
||||||
|
|
||||||
|
do j = jmino, jmaxo
|
||||||
|
fj = 2*(j + lbc(2) - 1) - 1 - lbf(2) + 1
|
||||||
|
|
||||||
|
! 优化点 1: 显式展开 Z 方向计算,减少循环开销
|
||||||
|
! 确保 ii 循环是最内层且连续访问
|
||||||
|
!DIR$ VECTOR ALWAYS
|
||||||
|
do ii = ii_lo, ii_hi
|
||||||
|
! 预计算当前 j 对应的 6 行在 Z 方向的压缩结果
|
||||||
|
! 这里直接硬编码 jj 的偏移,彻底消除一层循环
|
||||||
|
tmp_xz_plane(ii, 1) = C1*(funff(ii,fj-2,fk-2)+funff(ii,fj-2,fk+3)) + &
|
||||||
|
C2*(funff(ii,fj-2,fk-1)+funff(ii,fj-2,fk+2)) + &
|
||||||
|
C3*(funff(ii,fj-2,fk )+funff(ii,fj-2,fk+1))
|
||||||
|
tmp_xz_plane(ii, 2) = C1*(funff(ii,fj-1,fk-2)+funff(ii,fj-1,fk+3)) + &
|
||||||
|
C2*(funff(ii,fj-1,fk-1)+funff(ii,fj-1,fk+2)) + &
|
||||||
|
C3*(funff(ii,fj-1,fk )+funff(ii,fj-1,fk+1))
|
||||||
|
tmp_xz_plane(ii, 3) = C1*(funff(ii,fj ,fk-2)+funff(ii,fj ,fk+3)) + &
|
||||||
|
C2*(funff(ii,fj ,fk-1)+funff(ii,fj ,fk+2)) + &
|
||||||
|
C3*(funff(ii,fj ,fk )+funff(ii,fj ,fk+1))
|
||||||
|
tmp_xz_plane(ii, 4) = C1*(funff(ii,fj+1,fk-2)+funff(ii,fj+1,fk+3)) + &
|
||||||
|
C2*(funff(ii,fj+1,fk-1)+funff(ii,fj+1,fk+2)) + &
|
||||||
|
C3*(funff(ii,fj+1,fk )+funff(ii,fj+1,fk+1))
|
||||||
|
tmp_xz_plane(ii, 5) = C1*(funff(ii,fj+2,fk-2)+funff(ii,fj+2,fk+3)) + &
|
||||||
|
C2*(funff(ii,fj+2,fk-1)+funff(ii,fj+2,fk+2)) + &
|
||||||
|
C3*(funff(ii,fj+2,fk )+funff(ii,fj+2,fk+1))
|
||||||
|
tmp_xz_plane(ii, 6) = C1*(funff(ii,fj+3,fk-2)+funff(ii,fj+3,fk+3)) + &
|
||||||
|
C2*(funff(ii,fj+3,fk-1)+funff(ii,fj+3,fk+2)) + &
|
||||||
|
C3*(funff(ii,fj+3,fk )+funff(ii,fj+3,fk+1))
|
||||||
|
end do
|
||||||
|
|
||||||
|
! 优化点 2: 同样向量化 Y 方向压缩
|
||||||
|
!DIR$ VECTOR ALWAYS
|
||||||
|
do ii = ii_lo, ii_hi
|
||||||
|
tmp_x_line(ii) = C1*(tmp_xz_plane(ii, 1) + tmp_xz_plane(ii, 6)) + &
|
||||||
|
C2*(tmp_xz_plane(ii, 2) + tmp_xz_plane(ii, 5)) + &
|
||||||
|
C3*(tmp_xz_plane(ii, 3) + tmp_xz_plane(ii, 4))
|
||||||
|
end do
|
||||||
|
|
||||||
|
! 优化点 3: 最终写入,利用已经缓存在 tmp_x_line 的数据
|
||||||
|
do i = imino, imaxo
|
||||||
|
fi = 2*(i + lbc(1) - 1) - 1 - lbf(1) + 1
|
||||||
|
func(i, j, k) = C1*(tmp_x_line(fi-2) + tmp_x_line(fi+3)) + &
|
||||||
|
C2*(tmp_x_line(fi-1) + tmp_x_line(fi+2)) + &
|
||||||
|
C3*(tmp_x_line(fi ) + tmp_x_line(fi+1))
|
||||||
|
end do
|
||||||
|
end do
|
||||||
|
end do
|
||||||
|
#if 0
|
||||||
do k = kmino,kmaxo
|
do k = kmino,kmaxo
|
||||||
do j = jmino,jmaxo
|
do j = jmino,jmaxo
|
||||||
do i = imino,imaxo
|
do i = imino,imaxo
|
||||||
@@ -2462,7 +2558,7 @@
|
|||||||
enddo
|
enddo
|
||||||
enddo
|
enddo
|
||||||
enddo
|
enddo
|
||||||
|
#endif
|
||||||
return
|
return
|
||||||
|
|
||||||
end subroutine restrict3
|
end subroutine restrict3
|
||||||
|
|||||||
212
AMSS_NCKU_source/rungekutta4_rout_c.C
Normal file
212
AMSS_NCKU_source/rungekutta4_rout_c.C
Normal file
@@ -0,0 +1,212 @@
|
|||||||
|
#include "rungekutta4_rout.h"
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <cstddef>
|
||||||
|
#include <complex>
|
||||||
|
#include <immintrin.h>
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
inline void rk4_stage0(std::size_t n,
|
||||||
|
const double *__restrict f0,
|
||||||
|
const double *__restrict frhs,
|
||||||
|
double *__restrict f1,
|
||||||
|
double c) {
|
||||||
|
std::size_t i = 0;
|
||||||
|
#if defined(__AVX512F__)
|
||||||
|
const __m512d vc = _mm512_set1_pd(c);
|
||||||
|
for (; i + 7 < n; i += 8) {
|
||||||
|
const __m512d v0 = _mm512_loadu_pd(f0 + i);
|
||||||
|
const __m512d vr = _mm512_loadu_pd(frhs + i);
|
||||||
|
_mm512_storeu_pd(f1 + i, _mm512_fmadd_pd(vc, vr, v0));
|
||||||
|
}
|
||||||
|
#elif defined(__AVX2__)
|
||||||
|
const __m256d vc = _mm256_set1_pd(c);
|
||||||
|
for (; i + 3 < n; i += 4) {
|
||||||
|
const __m256d v0 = _mm256_loadu_pd(f0 + i);
|
||||||
|
const __m256d vr = _mm256_loadu_pd(frhs + i);
|
||||||
|
_mm256_storeu_pd(f1 + i, _mm256_fmadd_pd(vc, vr, v0));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#pragma ivdep
|
||||||
|
for (; i < n; ++i) {
|
||||||
|
f1[i] = f0[i] + c * frhs[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void rk4_rhs_accum(std::size_t n,
|
||||||
|
const double *__restrict f1,
|
||||||
|
double *__restrict frhs) {
|
||||||
|
std::size_t i = 0;
|
||||||
|
#if defined(__AVX512F__)
|
||||||
|
const __m512d v2 = _mm512_set1_pd(2.0);
|
||||||
|
for (; i + 7 < n; i += 8) {
|
||||||
|
const __m512d v1 = _mm512_loadu_pd(f1 + i);
|
||||||
|
const __m512d vrhs = _mm512_loadu_pd(frhs + i);
|
||||||
|
_mm512_storeu_pd(frhs + i, _mm512_fmadd_pd(v2, v1, vrhs));
|
||||||
|
}
|
||||||
|
#elif defined(__AVX2__)
|
||||||
|
const __m256d v2 = _mm256_set1_pd(2.0);
|
||||||
|
for (; i + 3 < n; i += 4) {
|
||||||
|
const __m256d v1 = _mm256_loadu_pd(f1 + i);
|
||||||
|
const __m256d vrhs = _mm256_loadu_pd(frhs + i);
|
||||||
|
_mm256_storeu_pd(frhs + i, _mm256_fmadd_pd(v2, v1, vrhs));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#pragma ivdep
|
||||||
|
for (; i < n; ++i) {
|
||||||
|
frhs[i] = frhs[i] + 2.0 * f1[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void rk4_f1_from_f0_f1(std::size_t n,
|
||||||
|
const double *__restrict f0,
|
||||||
|
double *__restrict f1,
|
||||||
|
double c) {
|
||||||
|
std::size_t i = 0;
|
||||||
|
#if defined(__AVX512F__)
|
||||||
|
const __m512d vc = _mm512_set1_pd(c);
|
||||||
|
for (; i + 7 < n; i += 8) {
|
||||||
|
const __m512d v0 = _mm512_loadu_pd(f0 + i);
|
||||||
|
const __m512d v1 = _mm512_loadu_pd(f1 + i);
|
||||||
|
_mm512_storeu_pd(f1 + i, _mm512_fmadd_pd(vc, v1, v0));
|
||||||
|
}
|
||||||
|
#elif defined(__AVX2__)
|
||||||
|
const __m256d vc = _mm256_set1_pd(c);
|
||||||
|
for (; i + 3 < n; i += 4) {
|
||||||
|
const __m256d v0 = _mm256_loadu_pd(f0 + i);
|
||||||
|
const __m256d v1 = _mm256_loadu_pd(f1 + i);
|
||||||
|
_mm256_storeu_pd(f1 + i, _mm256_fmadd_pd(vc, v1, v0));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#pragma ivdep
|
||||||
|
for (; i < n; ++i) {
|
||||||
|
f1[i] = f0[i] + c * f1[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void rk4_stage3(std::size_t n,
|
||||||
|
const double *__restrict f0,
|
||||||
|
double *__restrict f1,
|
||||||
|
const double *__restrict frhs,
|
||||||
|
double c) {
|
||||||
|
std::size_t i = 0;
|
||||||
|
#if defined(__AVX512F__)
|
||||||
|
const __m512d vc = _mm512_set1_pd(c);
|
||||||
|
for (; i + 7 < n; i += 8) {
|
||||||
|
const __m512d v0 = _mm512_loadu_pd(f0 + i);
|
||||||
|
const __m512d v1 = _mm512_loadu_pd(f1 + i);
|
||||||
|
const __m512d vr = _mm512_loadu_pd(frhs + i);
|
||||||
|
_mm512_storeu_pd(f1 + i, _mm512_fmadd_pd(vc, _mm512_add_pd(v1, vr), v0));
|
||||||
|
}
|
||||||
|
#elif defined(__AVX2__)
|
||||||
|
const __m256d vc = _mm256_set1_pd(c);
|
||||||
|
for (; i + 3 < n; i += 4) {
|
||||||
|
const __m256d v0 = _mm256_loadu_pd(f0 + i);
|
||||||
|
const __m256d v1 = _mm256_loadu_pd(f1 + i);
|
||||||
|
const __m256d vr = _mm256_loadu_pd(frhs + i);
|
||||||
|
_mm256_storeu_pd(f1 + i, _mm256_fmadd_pd(vc, _mm256_add_pd(v1, vr), v0));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#pragma ivdep
|
||||||
|
for (; i < n; ++i) {
|
||||||
|
f1[i] = f0[i] + c * (f1[i] + frhs[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
|
||||||
|
void f_rungekutta4_scalar(double &dT, double &f0, double &f1, double &f_rhs, int &RK4) {
|
||||||
|
constexpr double F1o6 = 1.0 / 6.0;
|
||||||
|
constexpr double HLF = 0.5;
|
||||||
|
constexpr double TWO = 2.0;
|
||||||
|
|
||||||
|
switch (RK4) {
|
||||||
|
case 0:
|
||||||
|
f1 = f0 + HLF * dT * f_rhs;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
f_rhs = f_rhs + TWO * f1;
|
||||||
|
f1 = f0 + HLF * dT * f1;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
f_rhs = f_rhs + TWO * f1;
|
||||||
|
f1 = f0 + dT * f1;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
f1 = f0 + F1o6 * dT * (f1 + f_rhs);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
std::fprintf(stderr, "rungekutta4_scalar_c: invalid RK4 stage %d\n", RK4);
|
||||||
|
std::abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void rungekutta4_cplxscalar_(double &dT,
|
||||||
|
std::complex<double> &f0,
|
||||||
|
std::complex<double> &f1,
|
||||||
|
std::complex<double> &f_rhs,
|
||||||
|
int &RK4) {
|
||||||
|
constexpr double F1o6 = 1.0 / 6.0;
|
||||||
|
constexpr double HLF = 0.5;
|
||||||
|
constexpr double TWO = 2.0;
|
||||||
|
|
||||||
|
switch (RK4) {
|
||||||
|
case 0:
|
||||||
|
f1 = f0 + HLF * dT * f_rhs;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
f_rhs = f_rhs + TWO * f1;
|
||||||
|
f1 = f0 + HLF * dT * f1;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
f_rhs = f_rhs + TWO * f1;
|
||||||
|
f1 = f0 + dT * f1;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
f1 = f0 + F1o6 * dT * (f1 + f_rhs);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
std::fprintf(stderr, "rungekutta4_cplxscalar_c: invalid RK4 stage %d\n", RK4);
|
||||||
|
std::abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int f_rungekutta4_rout(int *ex, double &dT,
|
||||||
|
double *f0, double *f1, double *f_rhs,
|
||||||
|
int &RK4) {
|
||||||
|
const std::size_t n = static_cast<std::size_t>(ex[0]) *
|
||||||
|
static_cast<std::size_t>(ex[1]) *
|
||||||
|
static_cast<std::size_t>(ex[2]);
|
||||||
|
const double *const __restrict f0r = f0;
|
||||||
|
double *const __restrict f1r = f1;
|
||||||
|
double *const __restrict frhs = f_rhs;
|
||||||
|
|
||||||
|
if (__builtin_expect(static_cast<unsigned>(RK4) > 3u, 0)) {
|
||||||
|
std::fprintf(stderr, "rungekutta4_rout_c: invalid RK4 stage %d\n", RK4);
|
||||||
|
std::abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (RK4) {
|
||||||
|
case 0:
|
||||||
|
rk4_stage0(n, f0r, frhs, f1r, 0.5 * dT);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
rk4_rhs_accum(n, f1r, frhs);
|
||||||
|
rk4_f1_from_f0_f1(n, f0r, f1r, 0.5 * dT);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
rk4_rhs_accum(n, f1r, frhs);
|
||||||
|
rk4_f1_from_f0_f1(n, f0r, f1r, dT);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
rk4_stage3(n, f0r, f1r, frhs, (1.0 / 6.0) * dT);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // extern "C"
|
||||||
@@ -5,6 +5,7 @@
|
|||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
/* 主网格:0-based -> 1D */
|
/* 主网格:0-based -> 1D */
|
||||||
static inline size_t idx_ex(int i0, int j0, int k0, const int ex[3]) {
|
static inline size_t idx_ex(int i0, int j0, int k0, const int ex[3]) {
|
||||||
const int ex1 = ex[0], ex2 = ex[1];
|
const int ex1 = ex[0], ex2 = ex[1];
|
||||||
@@ -87,60 +88,159 @@ static inline size_t idx_funcc_F(int iF, int jF, int kF, int ord, const int extc
|
|||||||
* funcc(:,:,-i) = funcc(:,:,i+1)*SoA(3)
|
* funcc(:,:,-i) = funcc(:,:,i+1)*SoA(3)
|
||||||
* enddo
|
* enddo
|
||||||
*/
|
*/
|
||||||
|
static inline void symmetry_bd_impl(int ord,
|
||||||
|
int shift,
|
||||||
|
const int extc[3],
|
||||||
|
const double *__restrict func,
|
||||||
|
double *__restrict funcc,
|
||||||
|
const double SoA[3])
|
||||||
|
{
|
||||||
|
const int extc1 = extc[0], extc2 = extc[1], extc3 = extc[2];
|
||||||
|
const int nx = extc1 + ord;
|
||||||
|
const int ny = extc2 + ord;
|
||||||
|
|
||||||
|
const size_t snx = (size_t)nx;
|
||||||
|
const size_t splane = (size_t)nx * (size_t)ny;
|
||||||
|
const size_t interior_i = (size_t)shift + 1u; /* iF = 1 */
|
||||||
|
const size_t interior_j = ((size_t)shift + 1u) * snx; /* jF = 1 */
|
||||||
|
const size_t interior_k = ((size_t)shift + 1u) * splane; /* kF = 1 */
|
||||||
|
const size_t interior0 = interior_k + interior_j + interior_i;
|
||||||
|
|
||||||
|
/* 1) funcc(1:extc1,1:extc2,1:extc3) = func */
|
||||||
|
for (int k0 = 0; k0 < extc3; ++k0) {
|
||||||
|
const double *src_k = func + (size_t)k0 * (size_t)extc2 * (size_t)extc1;
|
||||||
|
const size_t dst_k0 = interior0 + (size_t)k0 * splane;
|
||||||
|
for (int j0 = 0; j0 < extc2; ++j0) {
|
||||||
|
const double *src = src_k + (size_t)j0 * (size_t)extc1;
|
||||||
|
double *dst = funcc + dst_k0 + (size_t)j0 * snx;
|
||||||
|
memcpy(dst, src, (size_t)extc1 * sizeof(double));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 2) funcc(-i,1:extc2,1:extc3) = funcc(i+1,1:extc2,1:extc3)*SoA(1) */
|
||||||
|
const double s1 = SoA[0];
|
||||||
|
if (s1 == 1.0) {
|
||||||
|
for (int ii = 0; ii < ord; ++ii) {
|
||||||
|
const size_t dst_i = (size_t)(shift - ii);
|
||||||
|
const size_t src_i = (size_t)(shift + ii + 1);
|
||||||
|
for (int k0 = 0; k0 < extc3; ++k0) {
|
||||||
|
const size_t kbase = interior_k + (size_t)k0 * splane + interior_j;
|
||||||
|
for (int j0 = 0; j0 < extc2; ++j0) {
|
||||||
|
const size_t off = kbase + (size_t)j0 * snx;
|
||||||
|
funcc[off + dst_i] = funcc[off + src_i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (s1 == -1.0) {
|
||||||
|
for (int ii = 0; ii < ord; ++ii) {
|
||||||
|
const size_t dst_i = (size_t)(shift - ii);
|
||||||
|
const size_t src_i = (size_t)(shift + ii + 1);
|
||||||
|
for (int k0 = 0; k0 < extc3; ++k0) {
|
||||||
|
const size_t kbase = interior_k + (size_t)k0 * splane + interior_j;
|
||||||
|
for (int j0 = 0; j0 < extc2; ++j0) {
|
||||||
|
const size_t off = kbase + (size_t)j0 * snx;
|
||||||
|
funcc[off + dst_i] = -funcc[off + src_i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int ii = 0; ii < ord; ++ii) {
|
||||||
|
const size_t dst_i = (size_t)(shift - ii);
|
||||||
|
const size_t src_i = (size_t)(shift + ii + 1);
|
||||||
|
for (int k0 = 0; k0 < extc3; ++k0) {
|
||||||
|
const size_t kbase = interior_k + (size_t)k0 * splane + interior_j;
|
||||||
|
for (int j0 = 0; j0 < extc2; ++j0) {
|
||||||
|
const size_t off = kbase + (size_t)j0 * snx;
|
||||||
|
funcc[off + dst_i] = funcc[off + src_i] * s1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 3) funcc(:,-j,1:extc3) = funcc(:,j+1,1:extc3)*SoA(2) */
|
||||||
|
const double s2 = SoA[1];
|
||||||
|
if (s2 == 1.0) {
|
||||||
|
for (int jj = 0; jj < ord; ++jj) {
|
||||||
|
const size_t dst_j = (size_t)(shift - jj) * snx;
|
||||||
|
const size_t src_j = (size_t)(shift + jj + 1) * snx;
|
||||||
|
for (int k0 = 0; k0 < extc3; ++k0) {
|
||||||
|
const size_t kbase = interior_k + (size_t)k0 * splane;
|
||||||
|
double *dst = funcc + kbase + dst_j;
|
||||||
|
const double *src = funcc + kbase + src_j;
|
||||||
|
for (int i = 0; i < nx; ++i) dst[i] = src[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (s2 == -1.0) {
|
||||||
|
for (int jj = 0; jj < ord; ++jj) {
|
||||||
|
const size_t dst_j = (size_t)(shift - jj) * snx;
|
||||||
|
const size_t src_j = (size_t)(shift + jj + 1) * snx;
|
||||||
|
for (int k0 = 0; k0 < extc3; ++k0) {
|
||||||
|
const size_t kbase = interior_k + (size_t)k0 * splane;
|
||||||
|
double *dst = funcc + kbase + dst_j;
|
||||||
|
const double *src = funcc + kbase + src_j;
|
||||||
|
for (int i = 0; i < nx; ++i) dst[i] = -src[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int jj = 0; jj < ord; ++jj) {
|
||||||
|
const size_t dst_j = (size_t)(shift - jj) * snx;
|
||||||
|
const size_t src_j = (size_t)(shift + jj + 1) * snx;
|
||||||
|
for (int k0 = 0; k0 < extc3; ++k0) {
|
||||||
|
const size_t kbase = interior_k + (size_t)k0 * splane;
|
||||||
|
double *dst = funcc + kbase + dst_j;
|
||||||
|
const double *src = funcc + kbase + src_j;
|
||||||
|
for (int i = 0; i < nx; ++i) dst[i] = src[i] * s2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 4) funcc(:,:,-k) = funcc(:,:,k+1)*SoA(3) */
|
||||||
|
const double s3 = SoA[2];
|
||||||
|
if (s3 == 1.0) {
|
||||||
|
for (int kk = 0; kk < ord; ++kk) {
|
||||||
|
const size_t dst_k = (size_t)(shift - kk) * splane;
|
||||||
|
const size_t src_k = (size_t)(shift + kk + 1) * splane;
|
||||||
|
double *dst = funcc + dst_k;
|
||||||
|
const double *src = funcc + src_k;
|
||||||
|
for (size_t p = 0; p < splane; ++p) dst[p] = src[p];
|
||||||
|
}
|
||||||
|
} else if (s3 == -1.0) {
|
||||||
|
for (int kk = 0; kk < ord; ++kk) {
|
||||||
|
const size_t dst_k = (size_t)(shift - kk) * splane;
|
||||||
|
const size_t src_k = (size_t)(shift + kk + 1) * splane;
|
||||||
|
double *dst = funcc + dst_k;
|
||||||
|
const double *src = funcc + src_k;
|
||||||
|
for (size_t p = 0; p < splane; ++p) dst[p] = -src[p];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int kk = 0; kk < ord; ++kk) {
|
||||||
|
const size_t dst_k = (size_t)(shift - kk) * splane;
|
||||||
|
const size_t src_k = (size_t)(shift + kk + 1) * splane;
|
||||||
|
double *dst = funcc + dst_k;
|
||||||
|
const double *src = funcc + src_k;
|
||||||
|
for (size_t p = 0; p < splane; ++p) dst[p] = src[p] * s3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static inline void symmetry_bd(int ord,
|
static inline void symmetry_bd(int ord,
|
||||||
const int extc[3],
|
const int extc[3],
|
||||||
const double *func,
|
const double *func,
|
||||||
double *funcc,
|
double *funcc,
|
||||||
const double SoA[3])
|
const double SoA[3])
|
||||||
{
|
{
|
||||||
const int extc1 = extc[0], extc2 = extc[1], extc3 = extc[2];
|
if (ord <= 0) return;
|
||||||
|
|
||||||
// 1) funcc(1:extc1,1:extc2,1:extc3) = func
|
/* Fast paths used by current C kernels: ord=2 (derivs), ord=3 (lopsided/KO). */
|
||||||
// Fortran 的 (iF=1..extc1) 对应 C 的 func(i0=0..extc1-1)
|
if (ord == 2) {
|
||||||
for (int k0 = 0; k0 < extc3; ++k0) {
|
symmetry_bd_impl(2, 1, extc, func, funcc, SoA);
|
||||||
for (int j0 = 0; j0 < extc2; ++j0) {
|
return;
|
||||||
for (int i0 = 0; i0 < extc1; ++i0) {
|
}
|
||||||
const int iF = i0 + 1, jF = j0 + 1, kF = k0 + 1;
|
if (ord == 3) {
|
||||||
funcc[idx_funcc_F(iF, jF, kF, ord, extc)] = func[idx_func0(i0, j0, k0, extc)];
|
symmetry_bd_impl(3, 2, extc, func, funcc, SoA);
|
||||||
}
|
return;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2) do i=0..ord-1: funcc(-i, 1:extc2, 1:extc3) = funcc(i+1, ...)*SoA(1)
|
symmetry_bd_impl(ord, ord - 1, extc, func, funcc, SoA);
|
||||||
for (int ii = 0; ii <= ord - 1; ++ii) {
|
|
||||||
const int iF_dst = -ii; // 0, -1, -2, ...
|
|
||||||
const int iF_src = ii + 1; // 1, 2, 3, ...
|
|
||||||
for (int kF = 1; kF <= extc3; ++kF) {
|
|
||||||
for (int jF = 1; jF <= extc2; ++jF) {
|
|
||||||
funcc[idx_funcc_F(iF_dst, jF, kF, ord, extc)] =
|
|
||||||
funcc[idx_funcc_F(iF_src, jF, kF, ord, extc)] * SoA[0];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 3) do i=0..ord-1: funcc(:,-i, 1:extc3) = funcc(:, i+1, 1:extc3)*SoA(2)
|
|
||||||
// 注意 Fortran 这里的 ":" 表示 iF 从 (-ord+1..extc1) 全覆盖
|
|
||||||
for (int jj = 0; jj <= ord - 1; ++jj) {
|
|
||||||
const int jF_dst = -jj;
|
|
||||||
const int jF_src = jj + 1;
|
|
||||||
for (int kF = 1; kF <= extc3; ++kF) {
|
|
||||||
for (int iF = -ord + 1; iF <= extc1; ++iF) {
|
|
||||||
funcc[idx_funcc_F(iF, jF_dst, kF, ord, extc)] =
|
|
||||||
funcc[idx_funcc_F(iF, jF_src, kF, ord, extc)] * SoA[1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 4) do i=0..ord-1: funcc(:,:,-i) = funcc(:,:, i+1)*SoA(3)
|
|
||||||
for (int kk = 0; kk <= ord - 1; ++kk) {
|
|
||||||
const int kF_dst = -kk;
|
|
||||||
const int kF_src = kk + 1;
|
|
||||||
for (int jF = -ord + 1; jF <= extc2; ++jF) {
|
|
||||||
for (int iF = -ord + 1; iF <= extc1; ++iF) {
|
|
||||||
funcc[idx_funcc_F(iF, jF, kF_dst, ord, extc)] =
|
|
||||||
funcc[idx_funcc_F(iF, jF, kF_src, ord, extc)] * SoA[2];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -24,4 +24,10 @@ void lopsided(const int ex[3],
|
|||||||
const double *X, const double *Y, const double *Z,
|
const double *X, const double *Y, const double *Z,
|
||||||
const double *f, double *f_rhs,
|
const double *f, double *f_rhs,
|
||||||
const double *Sfx, const double *Sfy, const double *Sfz,
|
const double *Sfx, const double *Sfy, const double *Sfz,
|
||||||
int Symmetry, const double SoA[3]);
|
int Symmetry, const double SoA[3]);
|
||||||
|
|
||||||
|
void lopsided_kodis(const int ex[3],
|
||||||
|
const double *X, const double *Y, const double *Z,
|
||||||
|
const double *f, double *f_rhs,
|
||||||
|
const double *Sfx, const double *Sfy, const double *Sfz,
|
||||||
|
int Symmetry, const double SoA[3], double eps);
|
||||||
|
|||||||
@@ -43,7 +43,8 @@ def get_last_n_cores_per_socket(n=32):
|
|||||||
cpu_str = ",".join(segments)
|
cpu_str = ",".join(segments)
|
||||||
total = len(segments) * n
|
total = len(segments) * n
|
||||||
print(f" CPU binding: taskset -c {cpu_str} ({total} cores, last {n} per socket)")
|
print(f" CPU binding: taskset -c {cpu_str} ({total} cores, last {n} per socket)")
|
||||||
return f"taskset -c {cpu_str}"
|
#return f"taskset -c {cpu_str}"
|
||||||
|
return f""
|
||||||
|
|
||||||
|
|
||||||
## CPU core binding: dynamically select the last 32 cores of each socket (64 cores total)
|
## CPU core binding: dynamically select the last 32 cores of each socket (64 cores total)
|
||||||
@@ -69,7 +70,7 @@ def makefile_ABE():
|
|||||||
|
|
||||||
## Build command with CPU binding to nohz_full cores
|
## Build command with CPU binding to nohz_full cores
|
||||||
if (input_data.GPU_Calculation == "no"):
|
if (input_data.GPU_Calculation == "no"):
|
||||||
makefile_command = f"{NUMACTL_CPU_BIND} make -j{BUILD_JOBS} INTERP_LB_MODE=optimize ABE"
|
makefile_command = f"{NUMACTL_CPU_BIND} make -j{BUILD_JOBS} INTERP_LB_MODE=off ABE"
|
||||||
elif (input_data.GPU_Calculation == "yes"):
|
elif (input_data.GPU_Calculation == "yes"):
|
||||||
makefile_command = f"{NUMACTL_CPU_BIND} make -j{BUILD_JOBS} ABEGPU"
|
makefile_command = f"{NUMACTL_CPU_BIND} make -j{BUILD_JOBS} ABEGPU"
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -1,97 +0,0 @@
|
|||||||
# AMSS-NCKU PGO Profile Analysis Report
|
|
||||||
|
|
||||||
## 1. Profiling Environment
|
|
||||||
|
|
||||||
| Item | Value |
|
|
||||||
|------|-------|
|
|
||||||
| Compiler | Intel oneAPI DPC++/C++ 2025.3.0 (icpx/ifx) |
|
|
||||||
| Instrumentation Flag | `-fprofile-instr-generate` |
|
|
||||||
| Optimization Level (instrumented) | `-O2 -xHost -fma` |
|
|
||||||
| MPI Processes | 1 (single process to avoid MPI+instrumentation deadlock) |
|
|
||||||
| Profile File | `default_9725750769337483397_0.profraw` (327 KB) |
|
|
||||||
| Merged Profile | `default.profdata` (394 KB) |
|
|
||||||
| llvm-profdata | `/home/intel/oneapi/compiler/2025.3/bin/compiler/llvm-profdata` |
|
|
||||||
|
|
||||||
## 2. Reduced Simulation Parameters (for profiling run)
|
|
||||||
|
|
||||||
| Parameter | Production Value | Profiling Value |
|
|
||||||
|-----------|-----------------|-----------------|
|
|
||||||
| MPI_processes | 64 | 1 |
|
|
||||||
| grid_level | 9 | 4 |
|
|
||||||
| static_grid_level | 5 | 3 |
|
|
||||||
| static_grid_number | 96 | 24 |
|
|
||||||
| moving_grid_number | 48 | 16 |
|
|
||||||
| largest_box_xyz_max | 320^3 | 160^3 |
|
|
||||||
| Final_Evolution_Time | 1000.0 | 10.0 |
|
|
||||||
| Evolution_Step_Number | 10,000,000 | 1,000 |
|
|
||||||
| Detector_Number | 12 | 2 |
|
|
||||||
|
|
||||||
## 3. Profile Summary
|
|
||||||
|
|
||||||
| Metric | Value |
|
|
||||||
|--------|-------|
|
|
||||||
| Total instrumented functions | 1,392 |
|
|
||||||
| Functions with non-zero counts | 117 (8.4%) |
|
|
||||||
| Functions with zero counts | 1,275 (91.6%) |
|
|
||||||
| Maximum function entry count | 386,459,248 |
|
|
||||||
| Maximum internal block count | 370,477,680 |
|
|
||||||
| Total block count | 4,198,023,118 |
|
|
||||||
|
|
||||||
## 4. Top 20 Hotspot Functions
|
|
||||||
|
|
||||||
| Rank | Total Count | Max Block Count | Function | Category |
|
|
||||||
|------|------------|-----------------|----------|----------|
|
|
||||||
| 1 | 1,241,601,732 | 370,477,680 | `polint_` | Interpolation |
|
|
||||||
| 2 | 755,994,435 | 230,156,640 | `prolong3_` | Grid prolongation |
|
|
||||||
| 3 | 667,964,095 | 3,697,792 | `compute_rhs_bssn_` | BSSN RHS evolution |
|
|
||||||
| 4 | 539,736,051 | 386,459,248 | `symmetry_bd_` | Symmetry boundary |
|
|
||||||
| 5 | 277,310,808 | 53,170,728 | `lopsided_` | Lopsided FD stencil |
|
|
||||||
| 6 | 155,534,488 | 94,535,040 | `decide3d_` | 3D grid decision |
|
|
||||||
| 7 | 119,267,712 | 19,266,048 | `rungekutta4_rout_` | RK4 time integrator |
|
|
||||||
| 8 | 91,574,616 | 48,824,160 | `kodis_` | Kreiss-Oliger dissipation |
|
|
||||||
| 9 | 67,555,389 | 43,243,680 | `fderivs_` | Finite differences |
|
|
||||||
| 10 | 55,296,000 | 42,246,144 | `misc::fact(int)` | Factorial utility |
|
|
||||||
| 11 | 43,191,071 | 27,663,328 | `fdderivs_` | 2nd-order FD derivatives |
|
|
||||||
| 12 | 36,233,965 | 22,429,440 | `restrict3_` | Grid restriction |
|
|
||||||
| 13 | 24,698,512 | 17,231,520 | `polin3_` | Polynomial interpolation |
|
|
||||||
| 14 | 22,962,942 | 20,968,768 | `copy_` | Data copy |
|
|
||||||
| 15 | 20,135,696 | 17,259,168 | `Ansorg::barycentric(...)` | Spectral interpolation |
|
|
||||||
| 16 | 14,650,224 | 7,224,768 | `Ansorg::barycentric_omega(...)` | Spectral weights |
|
|
||||||
| 17 | 13,242,296 | 2,871,920 | `global_interp_` | Global interpolation |
|
|
||||||
| 18 | 12,672,000 | 7,734,528 | `sommerfeld_rout_` | Sommerfeld boundary |
|
|
||||||
| 19 | 6,872,832 | 1,880,064 | `sommerfeld_routbam_` | Sommerfeld boundary (BAM) |
|
|
||||||
| 20 | 5,709,900 | 2,809,632 | `l2normhelper_` | L2 norm computation |
|
|
||||||
|
|
||||||
## 5. Hotspot Category Breakdown
|
|
||||||
|
|
||||||
Top 20 functions account for ~98% of total execution counts:
|
|
||||||
|
|
||||||
| Category | Functions | Combined Count | Share |
|
|
||||||
|----------|-----------|---------------|-------|
|
|
||||||
| Interpolation / Prolongation / Restriction | polint_, prolong3_, restrict3_, polin3_, global_interp_, Ansorg::* | ~2,093M | ~50% |
|
|
||||||
| BSSN RHS + FD stencils | compute_rhs_bssn_, lopsided_, fderivs_, fdderivs_ | ~1,056M | ~25% |
|
|
||||||
| Boundary conditions | symmetry_bd_, sommerfeld_rout_, sommerfeld_routbam_ | ~559M | ~13% |
|
|
||||||
| Time integration | rungekutta4_rout_ | ~119M | ~3% |
|
|
||||||
| Dissipation | kodis_ | ~92M | ~2% |
|
|
||||||
| Utilities | misc::fact, decide3d_, copy_, l2normhelper_ | ~256M | ~6% |
|
|
||||||
|
|
||||||
## 6. Conclusions
|
|
||||||
|
|
||||||
1. **Profile data is valid**: 1,392 functions instrumented, 117 exercised with ~4.2 billion total counts.
|
|
||||||
2. **Hotspot concentration is high**: Top 5 functions alone account for ~76% of all counts, which is ideal for PGO — the compiler has strong branch/layout optimization targets.
|
|
||||||
3. **Fortran numerical kernels dominate**: `polint_`, `prolong3_`, `compute_rhs_bssn_`, `symmetry_bd_`, `lopsided_` are all Fortran routines in the inner evolution loop. PGO will optimize their branch prediction and basic block layout.
|
|
||||||
4. **91.6% of functions have zero counts**: These are code paths for unused features (GPU, BSSN-EScalar, BSSN-EM, Z4C, etc.). PGO will deprioritize them, improving instruction cache utilization.
|
|
||||||
5. **Profile is representative**: Despite the reduced grid size, the code path coverage matches production — the same kernels (RHS, prolongation, restriction, boundary) are exercised. PGO branch probabilities from this profile will transfer well to full-scale runs.
|
|
||||||
|
|
||||||
## 7. PGO Phase 2 Usage
|
|
||||||
|
|
||||||
To apply the profile, use the following flags in `makefile.inc`:
|
|
||||||
|
|
||||||
```makefile
|
|
||||||
CXXAPPFLAGS = -O3 -xHost -fp-model fast=2 -fma -ipo \
|
|
||||||
-fprofile-instr-use=/home/amss/AMSS-NCKU/pgo_profile/default.profdata \
|
|
||||||
-Dfortran3 -Dnewc -I${MKLROOT}/include
|
|
||||||
f90appflags = -O3 -xHost -fp-model fast=2 -fma -ipo \
|
|
||||||
-fprofile-instr-use=/home/amss/AMSS-NCKU/pgo_profile/default.profdata \
|
|
||||||
-align array64byte -fpp -I${MKLROOT}/include
|
|
||||||
```
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user