Palabos 사용자 매뉴얼 번역 및 학습 (b)는 시뮬레이션 및 데이터 평가를 실행

실행 시뮬레이션 및 평가 자료

Palabos 사용자 설명서 열째 장 및 제 12 장

(一) 시뮬레이션을 실행

원본 문서

Palabos 프로그램의 시간주기

격자 볼츠만 방법 (또는 적어도 그것 Palabos에 구현 된 바와 같이 "클래식"격자 볼츠만 법) 명시 솔버로 구성된다. 단일 반복 단계와, 다음의 시각 t +의 DT에 시간 t에서의 유체의 상태 진화. 다음의 논의는 DT = 1, 격자의 단위로지도된다. 이런 종류의 한 시간 반복 Palabos에 다음의 형식을 취합니다 :

  1. 시작하려면 모든 유체 변수는 시간 t에서 정의됩니다. 입자 집단은 (또한 "수신 집단"이라고 함) 사전 충돌 상태에있다.
  2. 충돌 연산자는 모든 셀에인가된다. 그들은 (또한 "나가는 변수"라고 함) 후 충돌 상태에있다.
  3. 스트리밍 연산자 격자에인가된다.
  4. 모든 데이터 프로세서는 격자 사이의 비 로컬 오퍼레이션 또는 커플 링을 수행하기 위해 실행된다.
  5. 인구 사전 충돌 상태에 이제 다시하지만 시간 t + 1에서.



충돌 단계 (단계 2) lattice.collide () 메소드를 호출하여 실행하고, 상기 스트리밍 단계 (단계 3)에있어서의 lattice.stream 불려 (). 이 두 가지 방법은 또한 lattice.collideAndStream 단일 호출로 결합 될 수있다 (). 이 한 번만 격자의 기억을 통해 여행에 의해 실행되기 때문에 대부분의 하드웨어 플랫폼에서 collideAndStream () 버전은 계산 더 효율적입니다.
데이터 프로세서에있어서 격자를 호출하여 수동으로 수행 될 수있다. executeInternalProcessors는 ()와 같은 통합 실행하고 데이터 처리 함수 (Functionals)을 감싸는 부분에서 설명. 데이터 프로세서는 또한 기능 스트림의 마지막에 ()와 함수 collideAndStream ()에서 자동으로 실행되기 때문 그러나 거의 수행되지 않습니다. 당신이 프로그램을 디버깅 예를 들어, 데이터 프로세서가 실행하지 않고 스트림 () 또는 collideAndStream를 호출하려는 경우 예를 lattice.collideAndStream 이러한 기능의 도메인 버전을 사용할 수 있습니다 (lattice.getBoundingBox을 ()).
Palabos에서, 데이터 프로세서는 항상 충돌 스트리밍주기 후 실행됩니다. 따라서, 비 로컬 동작은 항상 인구 사전 충돌 상태 (수신 인구)에있는 순간에서, 충돌 스트리밍 사이클 이후 실행된다. 시간 t의 충돌 전에 동작을 실행하는 시각 t-1, 오른쪽 후 스트리밍을 실행하는 것과 때문하지만, 일반성의 손실을 부담하지? 가장 자주 정확히 한 번만 실행 데이터 프로세서가하고자하는대로 유일한 문제는, 초기 조건에 발생하는 매우 적절한 초기 조건을 설정 한 후, 시작. 이 lattice.initialize 메소드를 호출함으로써 이루어진다 () 오른쪽 첫 번째 반복 공정을 시작하기 전에. 이 방법은, 일단 상기 데이터 프로세서가 실행

어느 시점에서 데이터를 평가합니까?

프로그램의 진화를 모니터링하기 위해서는 유용는 평균 에너지로, 때때로 약간의 유체 역학적 양을 평가하는 것입니다 :

pcout << computeAverageEnergy(lattice) << endl;

시스템이 사전 충돌 상태 (수신 인구)에 항상에만 유체 역학적 변수를 계산하는 것이 좋습니다. 이 구별은 정말 보존 된 변수의 밀도와 속도에 대한 중요하지만 (그들은 사전 및 사후 충돌 상태에서 동일), 그러한 스트레스 텐서로 비 보존 변수에 대한 중요합니다. 비 보존 속도 순간은 그들이 precollision 상태에서 계산 만 유체 역학적 변수에 관련 될 수있다. 당신이 방법 collideAndStream ()를 사용하는 경우 어쨌든 후 충돌 변수에 액세스 할 수 없기 때문에, 물건을 잘못 수행하는 위험이 없다는 것을 참고.
일반적으로, 위의 예에서의 평균 에너지와 같은 유체 역학적 변수의 계산은이 시점에서 모든 유체 역학적 변수는 잘 정의되어 있기 때문에, 바로 방법 collideAndStream ()를 호출 한 후에 수행되고, 충돌 사이의 시간의 동일한 순간에 대응 ( 및 속도를 스트리밍 아니라) 정의하지만, 변형 속도가 아닙니다. 예외는 격자의 내부 통계 이루어진다. 내부 통계 자동 성능에 영향을주지 않고 계산된다 (적어도되지 직렬 프로그램 상기 병렬 경우에, 제어 섹션 효율의 논의 참조)에 충돌하는 단계를 실행하는 부작용으로서. 이들은 그러나 시간 t에서 시간 t + 1 시스템을 운반 충돌 스트리밍주기 동안, 시간 t에서 유체 변수에 대한 평가됩니다. 그것은 방법 collideAndStream 호출하면 내부 통계를 액세스하는 것이 일반적이다 (). 예에서와 같이 평균 에너지를 계산하는 상기 충돌 및 충돌 스트리밍 및 스트리밍 한 후, 아래의 예에서와 같이, 내부 통계의 평균 에너지에 액세스하는 것과 동일한 결과를 생성하기 전에 :

pcout << getStoredAverageEnergy(lattice) << endl;
다른 중요한해야할 일

숫자는 종종 해석하기 어렵다. 정기적으로 프로그램에서 이미지를 생성에 그것은 당신이 시뮬레이션의 상태를 모니터링 가능한 한 빨리 문제를 식별하고, 필요한 경우 프로그램을 재 실행 할 수 그래서, 그러므로 유용하다. 2D 및 3D 시뮬레이션에서 제 일으키기 이미지는이 작업을 수행하는 방법에 대해 설명합니다.
마지막으로, 컴퓨터가 충돌하지 않을 경우 느슨한 모든 것을 위해 수시로 시뮬레이션의 상태를 저장하는 것이 좋은, 그리고 당신이 게시물에 대한 중요한 출력 파일을 생성 잊어 버린 경우 순서대로 데이터를 복구 할 수 있도록 - 가공. 이 섹션 검사 점에서 설명 : 저장하고 시뮬레이션의 상태를로드.

문서 번역

시간 Palabos 프로그램

시겔 볼츠만 방법 (또는 적어도 "고전"시겔 볼츠만 방법에서 구현 Palabos)는 명시 적 솔버 포함되어 있습니다. 반복적 인 단계를 통해, 시간 t에서의 + DT의 다음 시간 t에서의 유체의 상태의 진화. 다음 토론 DT = 1 항에 격자 단위. Palabos 이러한 반복적 인 시간의 형식을 취합니다 :

  1. 먼저, 유체의 모든 변수는 시간 t에서 정의되고, 사전 충돌 상태에서의 입자 그룹 (또한, 입사 입자 군이라고 함).
  2. 충돌 동작을 모든 셀에 적용된다. 이들은 충돌 한 상태에있다 (또한, "출력 변수"라 함).
  3. 스트리밍 동작은 격자에 적용.
  4. 모든 데이터 프로세서는 로컬 또는 비 격자의 결합 동작을 수행하도록 실행된다.
  5. 이제 인구는 충돌 전의 상태로 돌아 왔지만, 시간 t + 1입니다.

충돌 후 () 호출은 단계 (단계 3)로 흐른다 lattice.stream 사용 메소드 lattice.collision ()를 호출하여 (단계 2)를 수행한다. 또한 쌍으로 조합 될 수있다 이러한 두 가지 방법은 ()를 호출 한 lattice.collideandstream. 대부분의 하드웨어 플랫폼, 더 큰 계산 효율 collideAndStream () 버전에 만 메모리 격자 층에 한 번 실행하기 때문이다.
호출이 방법 lattice.executeInternalProcessors으로 할 수있다 () 수동으로 데이터 처리를 수행하는 이러한 구현, 통합과 같은 포장 데이터 기능들을 처리 (통합, 실행 및 마무리 함수 (Functionals)의 데이터 처리를 문서의 섹션 16.3.4). 상기 데이터 처리부의 기능을 자동으로 수행되는 스트림 () 함수 collideAndStream의 단부 ()은 그러나이 거의 일어나지 않는다. 당신은 데이터 프로세서 () 또는 collideAndStream () 수행하지 않고 스트림을 호출 할 경우, 예를 들어, 프로그램을 디버깅하기 위해, 당신은 lattice.collideAndStream 이러한 기능의 도메인 버전을 사용할 수 있습니다 (lattice.getboundingbox ()).
Palabos, 데이터 프로세서는 항상 충돌 흐름 진화주기 후에 실행된다. 따라서, 비 로컬 조작이 항상 충돌 흐름 사이클 후에 실행되는, 사전 충돌 상태 인구 (입사 입자 군)이 시간. 그러나,이 시간 t 충돌, 오른쪽 시간 t-1 스트림 후 그것을 실행할 해당 작업을 수행하기 전에하기 때문에, 일반성을 잃지하지 않는 이유는 무엇입니까? 초기 조건의 유일한 문제는 일반적인 상황에서는 상기 데이터 프로세서는, 단지 초기 조건을 설정 한 후에 한번만 실행되어 있기 때문이다. 이것은 첫 번째 반복 공정의 개시 전에있어서의 초기화 ()를 호출함으로써 이루어진다. 이 방법을 수행하는 하나 개의 데이터 프로세서 내부 통신을 수행하고 그것의 내부 상태를 내부를 블록이 동일해야한다.

어떤 시간에 데이터를 평가?

위하여는, 예를 들어, 평균 에너지 유용한 유체 역학적 볼륨의 일부를 평가하기 위해 때때로 절차를 모니터링 개발 :

pcout << computeAverageEnergy(lattice) << endl;

단지 사전 충돌 상태에서 추천 때 시스템에서 전산 유체 역학 변수 (입사 입자 군). 이러한 구별은 응력 텐서 가변적 밀도와 속도 (이들의 충돌 전에 충돌 이후 동일한 상태)이지만 비 보존 변수의 보존에 중요하지 않다하지만, 이는 중요하다. 비 보수적 속도 순간은 충돌 이전의 상태에서 계산 된 유체 역학적 변수와 연관 될 수 있습니다. 당신이 위험 collideAndStream () 메소드를 사용하면 어떤 경우 충돌 후 태그에 액세스 할 수 없기 때문에, 오류가 될 수 있음을 주목하기 바란다.
통상적으로, 호출 방법 collideAndStream는 (예를 들어, 위의 예에서의 평균 에너지) (후) 유체 역학적 변수를 계산하는 모든 변수는 잘 정의 된 유체 때문에 동일한 시간에 대응하는 (그리고 충돌 사이 속도 흐름 ) 잘 정의 된,하지만 변형률 속도. 통계 내부 격자 점은 예외이고, 내부 통계 (적어도되지 순차 프로그램 상기 병렬 경우에 대해 토론 설명 15.2Controlling 효율 항 참조) 자동 계산의 성능에 영향없는, 이것은 충돌 부작용을 수행하는 단계이다. 그러나, (시간 t로부터 시간 t + 1) 변수는 충돌주기에서의 유체 유동 시간 (T)에서 평가된다. 따라서, 호 collideAndStream () 메소드 후 내부 통계 일반적인 접근한다. 위의 예에서,하기 실시 예와 동일한 결과가 충돌 후 흐름의 내부 에너지의 평균 통계 값을 구하는 평균 에너지의 유동과 충돌하기 전에 계산 :

pcout << getStoredAverageEnergy(lattice) << endl;
다른 중요한 것들

숫자는 종종 해석하기 어렵다. 따라서 시뮬레이션의 상태를 모니터링 할 수 있도록 유용 이미지를 생성하기 위해 정기적으로 프로그램에, 가능한 한 빨리 문제를 식별하고, 필요한 경우 프로그램을 다시 실행하십시오. 2D 및 3D 시뮬레이션 (11.5 일으키기 이미지를 2D 및 3D 시뮬레이션에서 원래 섹션에서 이미지 생성 ) 섹션의이 작업을 수행하는 방법을 설명합니다.
당신은 키 후 처리에 대한 출력 파일을 생성하는 것을 잊지 경우 마지막으로, 시뮬레이션 상태가 항상 좋은 항상 저장 컴퓨터 충돌을 잃고 모든 것이 있지만, 데이터를 복원 할 수 있습니다되지 않도록 때. 이 체크됩니다 저장 및로드 상태 아날로그 (원래 제 11.7 검사 점 : 저장하고 상태를로드 시뮬레이션의) 해석.

설명

프로그램의이 부분은 분명히 작성된 충돌 흐름 사이클을 도입하는 것이다 collideAndStream () 메소드하여 통합 데이터 프로세서 통계적 절차 오류의 염려없이 직접 호출 할 수있는 계산, 데이터 처리 연산 단계는 충돌 및 유동에 작용하는 다음, 사후하지만 아날로그 세트에 대한 내부 및 경계 조건을의 좋은 다양한 후, 내부 PSO가되지 않았습니다 세트 또는 원래의 상태 만 다시 한 번 호출) 초기화 (호출 된 공정 처리 된 데이터는 PSO 정식 초기화.
가끔 원래의 텍스트를 포함하지 않는 버전은 데이터 단계, 중간 쓰기 반드시 중에서 시뮬레이션의 올바른 작동하지 않는 코드의 올바른 동작을 처리하고, 마지막 단계를 처리하는 해당 함수 호출 데이터에 의해 구현 말했다 사용 작업은 상 작업은, 결과 데이터는하지만 반드시 바로, 헤 헤 헤, 좋은 보인다.

(二) 데이터 평가

원본 문서

개요

격자 볼츠만 프로그램 시뮬레이션 변수 입자 집단 전형적인 유체 엔지니어, 거시적 변수 압력, 속도, 및 다른 관심있는 수량 대조적. 물론, 하나 개의 요구는 어떻게 든 표준 후 처리 도구를 제공하기 전에 데이터를 변환합니다. 데이터 분석 및 다른 목적 부록 비 가변 동작에 나열된 전환, 평가, 또는 데이터의 변환을위한 많은 기능들은 Palabos 제공된다. 다른 기능은 매우 유사한 방식으로 작동되는 본 섹션에서 computeVelocity 기능은 예를 들어 설명한다. 이 기능은 2D와 3D의 경우에 정의되어, 그들은 원자 블록 및 멀티 블록으로 작동합니다. 그림을 위해, 다음과 같은 코드는 3D 멀티 블록의 경우를 참조하십시오.
함수 computeVelocity은 세 가지 버전으로 제공됩니다

// Version 1
void computeVelocity(MultiBlockLattice3D<T,Descriptor>& lattice,
MultiTensorField3D<T,Descriptor<T>::d>& velocity, Box3D domain);
// Version 2
std::unique_ptr<MultiTensorField3D<T,3> >
computeVelocity(MultiBlockLattice3D<T,Descriptor>& lattice, Box3D domain);
// Version 3
std::unique_ptr<MultiTensorField3D<T,3> >
computeVelocity(MultiBlockLattice3D<T,Descriptor>& lattice);

첫 번째 버전에서, 속도는 격자 블록의 서브 도메인에서 연산하고, 3 성분계 텐서 필드의 대응하는 서브 - 도메인에 기입된다. 블록 격자 및 텐서 필드는 동일한 크기를 가질 필요가 없으며이 같은 내부 블록 배치가 필요하지 않습니다. 도메인 블록 격자 또는 텐서 필드 중 하나의 크기를 초과하는 경우, 도메인은 대응 트리밍된다.
훨씬 더 자주 연습에서 사용되는 두 번째 버전에서는 도메인의 크기의 텐서 필드가 자동으로 생성되고 함수에서 반환. 함수의 반환 값에 사용되는 자동 포인터 키워드는 C ++ 표준 라이브러리가 제공하는 스마트 포인터의 클래스를 의미합니다. 사용자의 관점에서, 그것은 실질적으로 포인터와 동일합니다. 이 방법은 형식의 개체를 치료하는 것이 표준 : : unique_ptr <MultiTensorField3D <T, 3>> 당신은 유형 MultiTensorField3D <T, 3> *의 객체를 치료하는 것과 같은 방식이다. 둘 사이에 큰 차이는 자동으로 포인터가 자동 메모리 관리 메커니즘을 가지고, 당신은 포인터의이 유형에 삭제 연산자를 호출 할 필요가 없습니다 것입니다. 함수의 반환 값이 원시 포인터라면, 당신은 파이프 라인의 다른 사업자에 할 수 없을 것입니다
다음 코드는 함수 computeVelocity의 일반적인 사용 사례를 보여줍니다

pcout << *computeVelocity(lattice, domain) << endl;

여기서, 계산 된 속도 값을 즉시 단말로 리다이렉트된다. 함수 호출 앞에있는 별은 속도 필드에 포인터를 역 참조하는 데 사용됩니다. 이 프로그램 라인의 끝에서, 속도 필드의 메모리는 자동으로 해제되며, 명시 적으로 처리 할 필요가 없습니다.
세 번째 버전은 인자 영역이 격자 lattice.getBoundingBox ()의 전체 영역에 의해 대체 된 순수 편의 기능이다.

데이터 평가 연산자를 파이프 라이닝

computeVelocity 같은 함수의 리턴 값은 직접 다른 데이터 평가 연산자의 인수로서 재사용 할 수있다. 이 방식으로, 복잡한 표현식을 구성 할 수있다. 예를 들어, 이전 섹션의 함수 computeAverage 두 각 소자, 나눗셈의 놈 제곱의 계산에이어서, 속도 필드의 계산에 의해 대체 될 수있는 마지막 평균값의 계산 :

pcout << "The value "
      << *computeAverageEnergy(lattice) << " is the same as "
      << computeAverage(*multiply(0.5,*computeNormSqr(*computeVelocity(lattice))))
      << endl;

이 예에서 사용 된 모든 기능들은 부록 부록에 나열되어 일부 기능 / 클래스 참조. 데이터, 스칼라 필드의 구조 및 데이터 평가 사업자의 조합의 평가에 더 많은 예제는 디렉토리 예 / codesByTopic / scalarField에 제공됩니다.

문서 번역

개요

이러한 압력, 속도 및 다른 변수와 매크로 전형적인 유체 엔지니어 관심 달리 격자 볼츠만 시뮬레이션 프로그램에 다양한 양의 입자의 수. 데이터가 표준 후 처리 도구에 제공되기 전에 분명히, 필요성이 어떤 방법으로 데이터를 변환합니다. Palabos 데이터 변환 또는 상기 평가 함수의 전환의 수를 제공하고, 이러한 데이터 분석과 같은 다른 목적은 부록 불변 동작 (부록 : 비 가변 동작에 나열된위한 데이터 분석 및 기타 목적). 그것은 다른 기능의 작품과 매우 유사하기 때문에이 섹션에서는, 토론 예로 computeVelocity 기능을 것입니다. 2D와 3D의 경우에 대해 정의 된 이러한 기능은, 그들은 블록 및 원자 블록을 사용합니다. 설명의 편의를 위해, 다음의 코드 위치를 참조 3D 복수.
computeVelocity 기능은 세 가지 버전이 있습니다 :

// Version 1
void computeVelocity(MultiBlockLattice3D<T,Descriptor>& lattice,
MultiTensorField3D<T,Descriptor<T>::d>& velocity, Box3D domain);
// Version 2
std::unique_ptr<MultiTensorField3D<T,3> >
computeVelocity(MultiBlockLattice3D<T,Descriptor>& lattice, Box3D domain);
// Version 3
std::unique_ptr<MultiTensorField3D<T,3> >
computeVelocity(MultiBlockLattice3D<T,Descriptor>& lattice);

첫 번째 버전에서, 속도는 도메인의 블록 부 격자 계산하고, 각각의 하위 텐서 필드 결과는 세 가지 구성 요소가 기록된다. 그리고 텐서 필드는 동일하지 않습니다 내부 블록 배치를해야합니까, 블록 필요가 같은 크기를 가지고 있지 격자. 계산 된 필드는 상기 블록 크기 또는 격자 텐서 필드를 초과하는 경우, 계산 영역을 따라서 트리밍한다.
두 번째 버전 (실제로 일반적인)에서 텐서 필드가 자동으로 생성하는 기능에서 도메인 크기와 수익을 가지고있다. 자동 포인터 키의 기능 반환 값 ++ 표준 라이브러리 C 스마트 포인터의 클래스를 의미합니다. 사용자의 관점에서, 그것은 실제로 같은, 포인터이다. 이 수단 처리 표준 : unique_ptr <MultiTensorField3D <T, 3 >> 객체 처리 방법 및 MultiTensorField3D <T, 물체의 3> * 동일한 유형의 유형. 둘 사이의 주요 차이점은이 포인터 자동 자동 메모리 관리, 당신은 결코 연산자는 포인터의이 유형에 삭제 호출 할 필요가 없다는 것입니다. 함수의 반환 값은 원본에 대한 포인터 인 경우 (다음 섹션 참조) 당신이 그들에게 명시 적으로 포인터를 가리키는 결코 때문에 삭제할 수 없습니다, 그래서 당신은, 다른 파이프 라인 작업을 할 수 없습니다.
다음 코드 프로그램은 일반적인 함수 computeVelocity 예를 사용했을

pcout << *computeVelocity(lattice, domain) << endl;

여기서, 상기 계산 된 속도 값을 즉시 단말로 리다이렉트된다. 별표 앞에 함수 호출은 참조 포인터를 가리키는 속도 필드를 취소하는 데 사용됩니다. 프로그램의이 라인의 끝에서, 메모리는 자동으로 속도 필드를 해제, 명시 적으로 공개 할 필요는 없다.
세 번째 버전은 파라미터 필드는 필드 전체 격자에 의해 치환 편리한 순수 함수, 즉 lattice.getboundingbox ()이다.

파이프 라인 운영 평가

이러한 함수의 리턴 값을 직접 매개 변수 computeVelocity 다른 데이터 평가 연산자로 재사용 될 수있다. 이러한 방법으로, 우리는 복잡한 식을 구성 할 수 있습니다. 예를 들어, 이전 챕터 computeAverage 함수 속도 필드 대신에 사용될 수있는 계산하고, 각 요소의 산출 방법은 2로 나눈 값의 제곱, 마지막의 평균을 계산한다 :

pcout << "The value "
      << *computeAverageEnergy(lattice) << " is the same as "
      << computeAverage(*multiply(0.5,*computeNormSqr(*computeVelocity(lattice))))
      << endl;

이 예에서 사용 된 모든 기능은 부록 부록이다 : 목록의 일부 기능 / 클래스 참조. 평가에 더 스칼라 필드 예시적인 데이터 구조의 데이터를 제공하고, 상기 조성물의 예 / codesByTopic / scalarField 디렉토리 조작을 평가.

설명

모든 데이터 평가 작업, 형식과 동일하게 주어진 세 가지 방법으로 검토, 당신이 당신의 자신의 도메인 지정된 범위를 계산할 수 두 번째를 사용하는 것이 좋습니다.
데이터 평가 작업 부록 부록의 많은이 : 문구 내부의 부록에 따라 모든 기능의 작동 부분 기능 / 클래스 참조가 잘못 가고 있지만, 부록하지 않도록주의하시기 바랍니다 수없는 복잡한 파이프 라인 데이터 조작 코드로 작성할 수 있습니다 다른 복잡한 작업보다, 나는 매우 제어 할 수 없습니다 시도.
문제는 출력 결과는 본질적으로 같은 때 너무 적은 데이터 변경, 당신은 할 수 있다면 당신이 필요로하는 파일이, 그 코드가 기록 될 때 데이터 정확성 문제에 출력이라고, 제발 노트 해당 데이터 출력을 제공하기 전에 해결 잘못된 사실, 실제 상황은 변수 값 차이의 결과는 사후 처리는이 시점에, 제발 관심을 지불 사실상 존재하지 않는다, 너무 작이다.

완전한

게시 15 개 원래 기사 · 원 찬양 5 · 조회수 3677

추천

출처blog.csdn.net/qq_28632981/article/details/104119935