시간에 따라 변하는 Cp 값을 .txt로부터 받아오기(3차원 미분방정식)

Main Forums Solver 시간에 따라 변하는 Cp 값을 .txt로부터 받아오기(3차원 미분방정식)

This topic contains 12 replies, has 3 voices, and was last updated by  Prodo 3 years, 9 months ago.

Viewing 13 posts - 1 through 13 (of 13 total)
  • Author
    Posts
  • #1185
    Fine
    Fine
    Participant

    안녕하세요. 이번에 질문하고 싶은 내용은 위에서 말한 대로 시간에 따라 변하는 Cp값을 .txt문서로부터 불러와서 이를 이용해 3차 방정식을 푸는 것입니다.
    제가 구현한 대류 확산 방정식은 아래와 같습니다.

    solve
    (
    fvm::ddt(C) 
    + (1/por)*fvm::div(phi, C) 
    - fvm::laplacian(D, C) 
    + fvm::Sp((ktrans/por), C) 
    + fvm::Sp((lfc/por)*(p-lp), C) 
    == 
    (ktrans*Cp)
    
    );

    현재 time 은 0~120 까지 30개의 time step이 있고, 그에 따른 Cp(몰농도) 값은 아래와 같습니다.

    time(sec) concentration(moles)
    4 0.0
    8 0.0
    12 0.0
    16 0.0
    20 0.0
    24 0.10108117
    28 1.0127527
    32 2.0
    36 1.557599
    40 1.131114
    44 1.1927048
    48 1.289628
    52 1.295573
    56 1.140025
    60 1.038649
    64 1.0607834
    68 1.1071031
    72 1.0575966
    76 1.0918694
    80 1.0274673
    84 1.005336
    88 0.9897777
    92 0.93968034
    96 0.932393
    100 0.8909937
    104 0.93785316
    108 0.8845323
    112 0.91211754
    116 1.0066646
    120 0.92081094

    여기서부터 이제 막히네요. 텍스트 문서 속에 있는 이 값들을 어떻게 시간과 묶어서 읽어낼 수 있는지 궁금합니다.
    정확한 답이 아니더라도 좋은 의견 있으시면 자유롭게 답변 부탁드릴게요~!

    #1186
    Galios
    Galios
    Participant

    fine님 안녕하세요.
    음, 지금 문제를 보니까 일단 문제에 대한 구체적인 설명이 조금 더 있었으면 좋겠네요.
    C,D,Cp 값들이 각각 어떤 값을 의미하는지, 그리고 전체적인 simulation에 대해서 자세한 설명 부탁드립니다.

    #1187
    Fine
    Fine
    Participant

    답변 감사합니다. 그러고 보니 제가 case에 대한 설명이 부족했네요. 제대로 설명드리겠습니다.
    먼저, 제가 구현하고자 하는 simulation은 신체의 다공성 조직에 관한 내용입니다. 제가 앞서 보여드린 3차원 식을 통해서 C 값을 구하게 되는데, C는 조직 내에서의 농도를 의미하고, 이는 volScalarField로 구현되었습니다.
    D는 확산 상수로서 모든 영역에서 1e-09 로 일정합니다.
    ktrans, por은 침투성 계수와 공극률을 의미합니다. 이 값은 각각의 cell 별로 주어져있습니다.
    Cp는 모세혈관에서의 농도을 의미합니다.(Concentration in capillaries) 텍스트문서로 시간별로 주어집니다.
    전체 Mesh는 직사각형으로, 현재 x,y,z 방향으로 각각 45, 30, 10개의 node로 분할되어있습니다.
    압력과 속도는 현재 연속 방정식과 momentum equations로 계산되어 있는 상태입니다.
    지금 제가 하는 것은 솔버를 4초 단위로 30개의 time step, 즉 120초 동안의 값을 simulating 하는 것입니다. 각각의 time step 별로 Cp 값을 불러와서 주어진 3차원 방정식을 풀고, C값을 구하는 것이 되겠지요.
    혹시나 더 궁금하신 점이 있다면 말씀해주시기 바랍니다.

    #1188
    Galios
    Galios
    Participant

    Case에 대한 자세한 설명 감사합니다. 일단 그러면 fine님께서 쓰실만한 코드를 몇개 첨부해드릴테니까 이 코드들을 이용해서 한번 try 해보시기 바랍니다.

    1. “uniformFixedValueFvPatchField” (“src/finiteVolume/fields/fvPatchFields/derived/uniformFixedValue”)

    autoPtr<DataEntry<Type> > uniformValue_;
    
    uniformValue_(DataEntry<Type>::New("uniformValue", dict))
    {
        const scalar t = this->db().time().timeOutputValue();
        fvPatchField<Type>::operator==(uniformValue_->value(t));

    2. “applications/utilities/preProcessing/dsmcInitialise/dsmcInitialise.C”

    IOdictionary dsmcInitialiseDict
        (
            IOobject
            (
                "dsmcInitialiseDict",
                mesh.time().system(),
                mesh,
                IOobject::MUST_READ_IF_MODIFIED,
                IOobject::NO_WRITE
            )
        );

    3.
    3.1 Creatin section에 넣어주세요.

    IOdictionary cpDict
    (
        IOobject
        (
            "cpDict",
            mesh.time().constant(),
            mesh,
            IOobject::MUST_READ,
            IOobject::NO_WRITE
        )
    );
    
    autoPtr<DataEntry<scalar> > cpValue(DataEntry<scalar>::New("cpValue", cpDict));

    3.2 Calculation section에 넣어주세요. (Cp 사용하기 전에 넣어주셔야합니다.)
    Cp = cpValue->value(mesh.time().timeOutputValue()));
    4.
    4.1 constant 폴더 속에 cpDict라는 Dict 파일을 만들어주세요. 내용은 아래와 같습니다.
    * 지금 이대로 실행하면 header가 없다고 오류가 뜰 것입니다. 필요한 header 들은 복사해와주세요.

    cpValue     tableFile;       
    cpValueCoeffs       
    {       
        fileName     "$FOAM_CASE/myDataFile"
        outOfBounds  clamp;       
    }

    4.2 case 폴더 안에 “myDataFile”을 만들어 주세요. 그리고 위의 text 파일을 아래와 같이 형식을 바꿔서 정리해주세요.

    (
      (4 0.0)
      (8 0.0)
      (12 0.0)
      (16 0.0)
      (20 0.0)
      (24 0.10108117)
      (28 1.0127527)
      (32 2.0)
      (36 1.557599)
      (40 1.131114)
      (44 1.1927048)
      (48 1.289628)
      (52 1.295573)
      (56 1.140025)
      (60 1.038649)
      (64 1.0607834)
      (68 1.1071031)
      (72 1.0575966)
      (76 1.0918694)
      (80 1.0274673)
      (84 1.005336)
      (88 0.9897777)
      (92 0.93968034)
      (96 0.932393)
      (100 0.8909937)
      (104 0.93785316)
      (108 0.8845323)
      (112 0.91211754)
      (116 1.0066646)
      (120 0.92081094)
    );

    여기까지 해보고 안되면 다시 말해주세요^^

    #1189
    Fine
    Fine
    Participant

    말씀하신 대로 solver도 다시 만들고 다른 부분들도 수정 다 했습니다. 그래서 solver 자체는 compile이 되는데, 이를 case와 함께 실행을 했더니 error가 생기네요..
    일단 error code 첨부하겠습니다.

    --> FOAM FATAL ERROR: 
    Different dimensions for =
         dimensions : [0 0 0 0 1 0 0] = [0 0 0 0 0 0 0]
    
        From function dimensionSet::operator=(const dimensionSet&) const
        in file dimensionSet/dimensionSet.C at line 171.
    
    FOAM aborting
    
    #0  Foam::error::printStack(Foam::Ostream&) at ??:?
    #1  Foam::error::abort() at ??:?
    #2  Foam::dimensionSet::operator=(Foam::dimensionSet const&) const at ??:?
    #3  ? at ??:?
    #4  __libc_start_main in "/lib/x86_64-linux-gnu/libc.so.6"
    #5  ? at ??:?
    Aborted (core dumped)

    error code에서 말하는 line을 따라가보니 Cp 에 대한 line이네요.
    error line :
    Cp = cpValue->value(mesh.time().timeOutputValue()));
    error가 dimension에 대한 내용을 말하고 있어서 일단 이 부분은 두 세번 확인 해봤는데, 이상이 없는거 같네요.
    어디를 손을 대야 할지 감이 안잡힙니다. 도움 부탁드릴게요.

    #1190
    Galios
    Galios
    Participant

    말씀하시는 내용을 보니까 solver가 complie은 됬지만, 제대로 작동을 안하는 것 같네요.
    한 가지 지금 생각나는 것은 Cp 값을 scalar가 아니라 dimensionedScalar로 표현해야 할 것 같아요.
    참고할만한 코드 첨부해드릴게요.

    find $FOAM_UTILITIES $FOAM_SOLVERS -name "*.[CH]" -type f | xargs grep dimensionedScalar
    dimensionedScalar Cp("Cp", dimEnergy/dimTemperature, 0.0);
    dimensionedScalar Cp("Cp", dimensionSet(0, 2, -1 , 0, 0), 0.0);

    지금 보여드린 것은 제가 fine님 코드에 맞게 수정한 것이 아니라 그냥 참고용 예시로 보여드린 거니까 확인해보고 사용하세요^^

    #1191
    Fine
    Fine
    Participant

    galios님께서 말씀하신 내용을 제대로 이해했는지 모르겠네요.

    Info<< "Reading field Cp\n" << endl;
        volScalarField Cp
        (
            IOobject
            (
                "Cp",
                runTime.timeName(),
                mesh,
                IOobject::MUST_READ,
                IOobject::AUTO_WRITE
            ),
            mesh
        );

    createfileds.h 파일에서 위의 코드를 아래와 같이 변경했습니다.
    dimensionedScalar Cp("Cp", dimensionSet(0 0 0 0 1 0 0), 0.0);
    이렇게 말씀하신게 맞나요?

    #1192
    Fine
    Fine
    Participant

    조금 더 고민해보니 이해가 되네요. 다시 수정한 내용 올리겠습니다.
    1. createFields.h

    IOdictionary cpDict
       (
          IOobject
          (
               "cpDict",
              mesh.time().constant(),
              mesh,
              IOobject::MUST_READ,
              IOobject::NO_WRITE
          )
       );
    
    autoPtr<DataEntry<scalar> > cpValue(DataEntry<scalar>::New("cpValue", cpDict));
        
    
        dimensionedScalar Cp  
        (
              cpDict.lookup("Cp")
        );

    2. cpDict

    Cp        Cp    [0 0 0 0 1 0 0]    0;
    
    cpValue     tableFile;       
    cpValueCoeffs       
    {       
        fileName     "$FOAM_CASE/myDataFile"
        outOfBounds  clamp;       
    }

    여기까지 수정헀는데도 아직 error가 발생하네요.
    error code :

    --> FOAM FATAL IO ERROR: 
    error in IOstream "/home/ajay/OpenFOAM/ajay-2.4.0/run/tutorials/incompressible/porousSimpleFoam/cncrnozeroporositytime/myDataFile" for operation operator>>(Istream&, List<T>&) : reading first token
    
    file: /home/ajay/OpenFOAM/ajay-2.4.0/run/tutorials/incompressible/porousSimpleFoam/cncrnozeroporositytime/myDataFile at line 1.
    
        From function IOstream::fatalCheck(const char*) const
        in file db/IOstreams/IOstreams/IOstream.C at line 114.
    
    FOAM exiting

    myDataFile에서 뭔가 문제가 있는 것 같은데, 조언 부탁드립니다.

    #1193
    Galios
    Galios
    Participant

    음, 일단 조금 수정할만한 내용 말씀드릴게요.
    1. cpDict

    IOdictionary cpDict
       (
          IOobject
          (
               "cpDict",
              mesh.time().constant(),
              mesh,
              IOobject::MUST_READ,
              IOobject::NO_WRITE
          )
       );
    
    autoPtr<DataEntry<scalar> > cpValue(DataEntry<scalar>::New("cpValue", cpDict));
        
    dimensionedScalar Cp("Cp", dimensionSet(0, 0, 0, 0, 1, 0, 0), 0.0);

    2.
    Cp = cpValue->value(mesh.time().timeOutputValue());

    다시 한번 실행해보시고 말씀해주세요~^^

    #1194
    Fine
    Fine
    Participant

    말씀해주신대로 수정했는데, 계속 에러가 발생하네요.
    error code :

    Different dimensions for =
         dimensions : [0 0 0 0 1 0 0] = [0 0 0 0 0 0 0]
    
        From function dimensionSet::operator=(const dimensionSet&) const
        in file dimensionSet/dimensionSet.C at line 171.
    
    FOAM aborting
    
    #0  Foam::error::printStack(Foam::Ostream&) at ??:?
    #1  Foam::error::abort() at ??:?
    #2  Foam::dimensionSet::operator=(Foam::dimensionSet const&) const at ??:?
    #3  ? at ??:?
    #4  __libc_start_main in "/lib/x86_64-linux-gnu/libc.so.6"
    #5  ? at ??:?
    Aborted (core dumped)

    dimension에 대해서는 계속 체크 해봤는데, 이상하게 계속 dimension에 대해서 error가 발생하네요. 일단, 말씀하신대로 createFields.h, cpDict, myDataFile은 다 만들었고, Cp를 사용하기 전에 정의하는 것은 아래와 같이 했습니다.

    Cp = cpValue->value(mesh.time().timeOutputValue());
    
                      solve
                      (
                             fvm::ddt(C) 
                           + (1/por)*fvm::div(phi, C) 
                           - fvm::laplacian(D, C) 
                           + fvm::Sp((ktrans/por), C) 
                           + fvm::Sp((lfc/por)*(p-lp), C) 
                          == 
                            (ktrans*Cp)
    
                     );

    도대체 어디서 잘못된 걸까요…? dimension은 정말 확실하게 맞다고 생각하는데 어디가 잘못됬는지 모르겠네요.

    #1195

    Prodo
    Participant

    안녕하세요, fine님, galios님.
    두 분께서 나누시는 대화를 보다가 한 가지 떠오른 내용이 있어서 말씀드립니다.
    Cp를 정의 할때 code를 조금 바꾸면 어떨까요?
    previous code :
    Cp = cpValue->value(mesh.time().timeOutputValue());
    modified code :
    Cp.value() = cpValue->value(mesh.time().timeOutputValue());
    이 코드가 도움이 됬으면 좋겠네요.

    #1196
    Fine
    Fine
    Participant

    감사합니다 prodo님!
    드디어 됬어요!
    역시 프로그래밍은 문법이 중요한 것 같네요.. 진짜 소중한 지식 하나 배워갑니다.
    덕분에 고민을 하나 덜었습니다! 감사합니다!!

    #1197

    Prodo
    Participant

    도움이 됬다니 다행입니다.
    코드 완성하신 것 축하드리고, 마무리 결과 값까지 제대로 나오시기 바랍니다 ^^

Viewing 13 posts - 1 through 13 (of 13 total)

You must be logged in to reply to this topic.