gpt4 book ai didi

rust - 如何使用FFI将2D矢量从Rust传递到Fortran?

转载 作者:行者123 更新时间:2023-12-03 11:36:55 25 4
gpt4 key购买 nike

我正在尝试将2d f64矢量(Vec )从Rust传递给Fortran函数。我正在使用一维矢量和其他使用.as_mut_ptr()的Fortran函数。
我不完全确定如何为这样的事情发布一个最小的工作示例,但是在这里我们开始:

extern "C" {
fn fortran1_(
vector: *mut f64,
length1: *const uint32_t
);

fn fortran2_(
vector: *mut f64,
length1: *const uint32_t,
length2: *const uint32_t
);
}

pub fn fortran1(
length1: u32
) -> Vec<f64>{
let mut vector = vec![0_f64; length1];
unsafe{
fortran1_(
vector.as_mut_ptr(),
&length1)
}
return vector;
}

pub fn fortran2(
length1: u32,
length2: u32
)-> Vec<Vec<f64>>{
let mut vector = vec![vec![0_f64; length1]; length2];
unsafe{
fortran2_(vector.as_mut_ptr(),
&length1,
&length2)
}
return vector;
}
谢谢

最佳答案

rust Vec<Vec<_>>表示形式与Fortran的标准数据模型之间存在许多不匹配的情况。
Fortran希望将2维数组布置在f64的连续切片中,但是Vec<Vec<_>>将其每一行放入单独的堆分配中。
Fortran索引从1开始,但Vec从0开始。
最好实现struct Fortran2d<T> { vec: Vec<T>, rows: usize, cols:usize, }并在模拟Fortran索引的基础上实现方法。我认为那将是最不痛苦的。

impl Fortran2d<T> {
/// maps fortran style 2d index to internal vec index
fn index(&self, c: usize, r: usize) -> usize {
assert!(c > 0 && c <= self.cols);
assert!(r > 0 && r <= self.rows);
(c - 1) + (r - 1) * self.cols
}
}

关于rust - 如何使用FFI将2D矢量从Rust传递到Fortran?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64231896/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com