2013-04-05 4 views
1

FORTRAN 77에서 일부 실험 데이터의 매개 변수 값을 가져와야하는 시뮬레이션을 작성합니다. 데이터는 인터넷 데이터베이스에서 가져온 것이므로 사전에 다운로드했지만 계속적인 규모로 값을 제공하는 데 사용할 수있는 간단한 수학적 모델은 없습니다. 이산 데이터 포인트 만 있습니다. 그러나 x 축의 모든 값에 대해이 매개 변수를 알아야하며 데이터베이스에서 가져온 개별 값뿐만 아니라이 매개 변수도 알아야합니다. 높은 성능의 FORTRAN 코드에서 조회를 구현하는 현명한 방법

는 내가 x의 모든 정수 값에 대한 f(x)의 가치를 알고 말할 수있는, 간단하고, (결코 x 내가 지식이 가장 작거나 가장 큰 외부) 실제 xf(x)을 찾을 수있는 방법이 필요합니다.

제 아이디어는 데이터를 가져 와서 선형 보간법을 사용하여 매개 변수 값을 가져올 수 있다는 것입니다. 의사 코드 :

구현하려면 데이터 포인트에 대한 조회가 필요합니다. xd = int(x)dx = 1과 같이 모든 정수 x에 대한 데이터베이스에서 값을 가져 와서 쉽게 xd을 조회 할 수는 있지만 여전히 f(xd)에 대한 조회를 구현하는 방법을 알지 못합니다.

이것을 구현하는 좋은 방법은 무엇입니까?

하나의 시뮬레이션 실행 중에 값이 10^7에서 10^9까지 가져 오므로 성능이 중요합니다. 즉, f(xd) 값을 필요로 할 때마다 IO에서 읽는 것은 옵션이 아닙니다.

현재 각 줄에 한 쌍의 (탭 구분) x,f(x)이있는 텍스트 파일에 데이터 포인트가 있으므로 어떤 모양 으로든 데이터를 원활하게 가져올 수있는 솔루션을위한 보너스 포인트가 있습니다. 될 필요가있다.

답변

2

당신은 모든 정수에 대한 값을 가지고 있다고 말합니다. 당신은 M에서 N까지 모든 정수에 대해 i, f(i) 쌍을 갖고 있습니까? 그런 다음 값 f(i)y 어레이 M:N으로 읽습니다. 값의 수가 너무 큰 경우가 아니면. MN 사이의 실제 값의 경우 배열로 인덱싱하고 가장 가까운 값 쌍 사이를 쉽게 삽입 할 수 있습니다.

왜 FORTRAN 77을 사용합니까? Fortran 90/95/2003은 몇 년 동안 우리와 함께 해왔다 ...

EDIT : 의견에 대답하는 질문은 FORTRAN 77에서 한 번만 데이터 값을 읽는 방법을 다시 전화의 긴 사슬에서 기술 1 : 프로그램을 시작할 때 명명 된 공통 블록에있는 배열로 읽어들입니다.기술 2 : f(x)을 반환하는 함수가 처음 호출 된 경우 해당 값을 SAVE 문에있는 로컬 변수로 읽습니다. 함수가 첫 번째 호출에 있는지 여부를 지정하려면 SAVEd 인 논리를 사용하십시오. 일반적으로 기술 2는 더 "로컬"이지만 스레드 안전은 아닙니다. 병렬로 시뮬레이션을 수행하는 경우 프로그램이 멀티 스레드되기 전에 시작 단계에서 첫 번째 기법을 수행 할 수 있습니다.

다음은 SAVE : fortran SAVE statement의 사용 예입니다. (Fortran 95 표기법에서 ... FORTRAN 77로 변환). 데이터의 읽기를 IF 블록의 배열에 놓습니다.

+0

FORTRAN 77은 내가 일하고있는 그룹이 내게 강요합니다. 일시적인 입장입니다. 따라서 그룹을 계속 움직이게하는 이득이 학습보다 작다고 결정했습니다. P 값을 메모리로 읽는 방법 * 항상 한 번만 *, 항상 배열을 통과하지 않아도됩니까? 이 룩업은 스택 아래에 있습니다 - 가능하다면 4 개 또는 5 개의 장소에 여분의 함수 인수를 추가하지 않아도되고 싶습니다 ... –

+0

MPI를 사용하면 병렬로 실행됩니다 - 달리 말하면 실행합니다. 여러 개의 개별 프로세스에서 프로그램을 실행합니다 (그러나 프로세스 내에서 스레드 분기를 수행하지 않습니다). 공통적 인 블록이 안전한 방법으로 파일을 읽을 수 있도록 최선의 해결책이라고 생각합니다. 내일 시도해보고 작동하도록 할 수 있는지 알아 봅니다. –

+0

OK; 이제는 병렬 환경에서 안전하게 스레드 방식으로 작동하는 방식을 결정했습니다. 파일을 읽고 마스터 스레드에서 충분히 정밀한 x 해상도로 보간을 작성한 다음 해당 스레드를 다른 모든 스레드로 브로드 캐스팅합니다. 벡터는 인수로 전달되지 않도록 공통 블록에 상주합니다. 이 문제가 발생하면 아마 접근법의 선택과 관련이 없을 것입니다. 그러나 나는 서투른 프로그래머가되기 때문에 지금 해결 된 것으로 봅니다. 도와 주셔서 감사합니다! –

0

데이터를 보간하거나 삽입하는 방법을 원하지만 데이터의 차원, 데이터의 작동 방식, 데이터에 액세스하는 방식 (예 : 어쩌면 다음 요청은 항상 마지막에 가깝습니다.) 그리드가 어떻게 만들어 지는지 (일정 간격, 무작위 또는 다른 방식으로) 그리고 어떤 방법이 가장 적합한지를 데이터에서 확인할 수 있어야합니다.

그러나 기존 데이터 세트가 매우 밀도가 높고 선형에 가까운 경우 선형 보간을 할 수 있습니다.

+0

"선형 보간"과 "선형 적합"을 혼동하고 있습니까? 데이터는 선형에 가깝지 않으므로 선형 * 적합 *은 문제가되지 않습니다. 그러나 주어진 x 값에 가장 가까운 두 데이터 점을 찾는 좋은 방법을 찾을 수 있다면 이들 간의 선형 보간은 문제가되지 않습니다. (데이터가 x- 공간에서 충분히 밀도가 있는지 확인할 수 있습니다.)'x'와'f (x) '는 모두 스칼라이므로 모든 x 값과 모든 함수 값을 가진 행렬은 2-by -N, 여기서 N은 데이터 요소의 수입니다. –

0

데이터베이스 (파일)를 사용하면 fvals(ii)f(xmin + (ii-1) * dx) 인 배열 fvals을 만들 수 있습니다. x 값 xx과 배열 색인 간의 매핑은 ii = floor((xx - xmin)/dx) + 1입니다. ii을 알았 으면 주변 점을 사용하여 보간 할 수 있습니다. iiii+1을 사용한 선형 보간 또는 더 높은 차수의 다항식 보간을 수행합니다. 후자의 경우 Numerical Recipes에서 해당 polint 루틴을 사용할 수 있습니다. 103 페이지를 참조하십시오.