답변:
사용자가 알고리즘의 모든 측면을 지정하는 것은 번거 롭습니다. 알고리즘이 중첩 된 구성 요소를 허용하는 경우, 한정된 수의 옵션으로는 충분하지 않습니다. 따라서 명시 적 인수 또는 템플릿 매개 변수의 경우와 같이 옵션이 반드시 최상위 수준으로 "버블 링"될 필요는 없습니다. 이것을 소프트웨어 엔지니어링에서 "구성 문제"라고도합니다. PETSc 에는 구성 관리를위한 독창적 인 강력한 시스템이 있다고 생각 합니다. 제어 반전에 대한 Martin Fowler의 에세이 의 Service Locator 패턴과 유사합니다 .
PETSc의 구성 시스템은 솔버 객체 (get 및 set 쿼리 포함)와 옵션 데이터베이스가 관리하는 사용자 지정 구성을 조합하여 작동합니다. 시뮬레이션의 모든 구성 요소는 구성 옵션, 기본값 및 결과를 넣을 장소를 선언 할 수 있습니다. 중첩 객체에는 구성이 필요한 모든 객체를 독립적으로 처리 할 수 있도록 구성 할 수있는 접두사가 있습니다. 옵션 자체는 명령 행, 환경, 구성 파일 또는 코드에서 읽을 수 있습니다. 옵션이 선언되면 도움말 문자열과 매뉴얼 페이지가 지정되어 -help
옵션을 이해하고 올바르게 연결된 GUI를 작성할 수 있습니다.
사용자는 SetFromOptions
메소드를 호출하여 명령 행 옵션을 기반으로 오브젝트를 구성합니다. 이 함수 호출은 선택 사항이며 사용자 (PETSc를 호출하는 코드를 작성하는 사람)가 다른 인터페이스를 통해 옵션을 노출하는 경우 호출되지 않을 수 있습니다. 최종 사용자 (애플리케이션을 실행하는 사람)에게 많은 권한을 부여하기 때문에 옵션 데이터베이스를 공개하는 것이 좋습니다. 그러나 필수는 아닙니다.
via를 통해 호출되는 일반적인 구성
PetscObjectOptionsBegin(object); /* object has prefix and descriptive string */
PetscOptionsReal("-ts_atol", /* options database key */
"Absolute tolerance for local truncation error", /* long description */
"TSSetTolerances", /* function and man page on topic */
ts->atol, /* current/default value *?
&ts->atol, /* place to store value */
&option_set); /* TRUE if the option was set */
PetscOptionsList("-ts_type","Time stepping method","TSSetType",TSList,
defaultType,typeName,sizeof typeName,&option_set);
TSAdaptSetFromOptions(ts->adapt); /* configures adaptive controller method */
/* ... many others */
/* ... the following is only called from implicit implementations */
SNESSetFromOptions(ts->snes); /* configure nonlinear solver. */
PetscOptionsEnd();
노트:
PetscOptionsList()
사용자에게 동적 목록에서 선택 사항을 제공합니다. 새로운 구현이 호출자에게 일류로 노출 될 수있는 플러그인 아키텍처가 있습니다. (이러한 구현은 공유 라이브러리에 배치 할 수 있으며 프로그램을 다시 컴파일하지 않고도 일류 클래스로 사용할 수 있습니다.)SNESSetFromOptions()
선형 솔버, 전제 조건 및 구성이 필요한 기타 구성 요소를 재귀 적으로 구성합니다.필자는 자체 시뮬레이션 코드를 처음부터 개발할 때이 문제에 여러 번 직면했습니다. 어떤 매개 변수가 입력 파일에 들어가야하는지, 명령 행에서 가져와야합니다. (PETSc만큼 발전하지 않았습니다.)
실험적인 시뮬레이션 '프로그램'을 작성하는 대신 시뮬레이션을 실행하는 데 필요한 모든 함수와 클래스를 포함하는 Python 패키지를 작성하는 경향이 있습니다. 그런 다음 기존 입력 파일은 5-10 줄의 코드가있는 작은 Python 스크립트로 바뀝니다. 일부 행은 일반적으로 데이터 파일로드 및 출력 지정과 관련이 있습니다. 다른 것은 실제 계산에 대한 지침입니다. Python 패키지의 선택적 인수에 대한 기본값은 초보자가 간단한 시뮬레이션을 위해 라이브러리를 사용할 수있는 반면 고급 사용자는 여전히 모든 종과 휘파람에 액세스 할 수 있습니다.
몇 가지 예 :
먼저 알고리즘과 소프트웨어를 가능한 한 일반적으로 수행하겠습니다. 나는 이것을 어려운 방법으로 배웠다.
간단한 테스트 사례로 시작한다고 가정 해 봅시다. 더 빨리 할 수 있습니다. 그러나이 초기 사례에 대해 소프트웨어를 너무 구체적으로 설정하면 (너무 적은 매개 변수), 새로운 자유도를 추가 할 때마다 점점 더 많은 시간을 적용하게됩니다. 내가 지금하는 일은 일을 꽤 일반적으로 만들고 앞으로 나아갈 때 매개 변수의 변화를 늘리는 데 더 많은 시간을 소비합니다.
시작점에서 더 많은 매개 변수가 있기 때문에 처음부터 더 많은 테스트가 필요하지만 후자가 알고리즘을 사용하여 제로 또는 매우 저렴한 비용으로 많은 것을 할 수 있습니다.
예 : 알고리즘에는 두 벡터 함수의 내적을 계산하는 표면 적분이 포함됩니다. 장래에 표면을 변경하고 싶을 경우 표면의 크기, 형상 및 이산화를 가정하지 마십시오. 내적 함수를 만들고, 표면을 가능한 한 일반적으로 만들고, 공식적인 방식으로 적분을 계산하십시오. 각 기능을 별도로 테스트 할 수 있습니다.
처음에는 간단한 형상에 대한 통합을 시작하고 시작시 상수를 매개 변수로 선언 할 수 있습니다. 시간이 지남에 따라 지오메트리를 변경하려면 쉽게 할 수 있습니다. 처음에 가정을했다면 매번 전체 코드를 변경해야합니다.