Logotyp för Volupe

Blogginlägg Volupe

Simcenter STAR-CCM+ syntax för fältfunktioner, del 2

Förra veckan undersökte vi den grundläggande syntaxen för fältfunktioner i Simcenter STAR-CCM+. Den här veckan kommer vi att fortsätta att undersöka möjligheterna med syntaxen för fältfunktioner och se vad mer som kan göras. Förra gången fokuserade vi på rumslig begränsning för initiala förhållanden när det gäller temperatur. Skalaren är godtycklig, så vi kommer att se bortom den rumsliga diskretiseringen här och titta på att skriva fältfunktioner som är beroende av andra fysikaliska storheter än rymden. Det innebär att vi inte kommer att begränsa oss till position. Vi kommer också att undersöka på hur man interpolerar data från en tabell.

Tidssteg för rampning

I början av en transientsimulering är det ofta en bra idé att gå långsamt framåt i tiden med korta tidssteg och öka tidsstegsstorleken gradvis. En enkel linjär ramp för tidssteget kan skrivas enligt bilden nedan. Här ökas tidssteget linjärt till 0,1 s från simuleringstid 0 till 1 s.

Återigen tilldelar vi ett värde baserat på ett om-sats. Vi säger att om tiden är mindre än eller lika med 1 sekund är vårt tidssteg 0,1 gånger den faktiska tiden plus ytterligare 1e-4 s. Och om tiden är större än 1 s är vårt tidssteg istället 0,1 s. Den ytterligare 1e-4 s läggs till för att få ett giltigt tidssteg när simuleringen startar. Annars skulle det första tidssteget vara noll och simuleringen skulle inte börja gå framåt i tiden. Om detta är fallet får du en varning om att tidssteget måste skilja sig från noll.

Detta enkla uttryck har nu gjort det möjligt för oss att öka tidssteget, vilket förhoppningsvis antingen kommer att stabilisera vår lösning eller kan användas för att lösa en faktisk händelse på liten tidsskala. (${Time} <= 1 ? 0.1*${Time}+1e-4 : 0.1)

Interpolering av tabellvärden

I stället för att skapa ett eget uttryck kan vi också använda tabellvärden. Anta att vi har en tabell med värden och att vi vill använda den informationen som inloppstemperatur vid en gräns i vår simulering. Den enkla exempeltabellen som används här visas nedan, ett kvadratiskt förhållande mellan input (tid) och output (temperatur).

 

 

 

 

 

 

 

 

Vi skriver sedan en annan fältfunktion som hänvisar till den tabell vi har skapat, som här heter my_table. I vårt tidigare exempel ökade vi vårt tidsintervall med ett linjärt förhållande genom att endast använda syntaxen för fältfunktioner. I det här exemplet interpolerar vi temperaturens inloppsvärde med hjälp av tabellvärden i stället och använder nu en kvadratisk relation för vår utgång (temperaturen).

Observera också att en tabellinterpolation som överskrider tabellens ingångsvärde (max 10) fortfarande ger det högsta värdet från tabellen, eftersom uttrycket i det här exemplet fortfarande använder sig av interpolation från tabellen. Det betyder att om du kör upp till värdet 100 (i mer än 10 sekunder) finns det inget uttryckligt behov av att uttrycka vad som händer när tiden överskrider 10 s. (interpolateTable(@Table("my_table"), "input", LINEAR, "output", ${Time}))

Kombinera interpolering och uttalande

Anta istället att vi har en stegfunktion som indata i vår simulering enligt figuren nedan. I den här grafen sker en stor förändring i datainmatningen ungefär var 30:e sekund. Vi vill köra vår simulering med ett tidsintervall på 1 sekund, men vid de plötsliga förändringarna av inmatningen vill vi ställa in tidsintervallet på 0,1 s. Detta för att hantera den inverkan som förändringen har på vår simulering. Vi antar också att vi vill ha ett ganska allmänt uttryck för detta. Detta kommer att kräva att vårt uttryck tittar framåt i indata och ser om vi ska minska vår tidsstegsstorlek eller inte, eftersom vi vill att vår tidsstegsstorlek ska minskas före och inte efter de abrupta förändringarna. Hur kan detta göras? Eftersom vi kan se framåt i tabellen över indata kan vi basera vår tidsstegsstorlek på det framtida värdet för indata i vår simulering. Vi kan se i grafen nedan att när stora förändringar i utdata sker överstiger den absoluta förändringen minst 1. Vid de höga och låga lägena i vår graf sker fortfarande förändringar i utdata, men de överstiger sällan 0,1, varför det absoluta värdet på förändringen på 1 är ett säkert värde.

 

 

 

 

 

 

 

 

 

 

Vad vi gör är att jämföra det aktuella tidssteget, det interpolerade tabellvärdet vid Time=t, med det interpolerade tabellvärdet vid Time=t+1. Om förändringen är större än 1, minskar vi tidsstorleken till 0,1 s. Det fullständiga uttrycket och förhandsgranskningen kan ses i figuren nedan. (${Time} == 0 ? 0.1 : abs((interpolateTable(@Table("data_table"), "time", LINEAR, "Value", ${Time}) - interpolateTable(@Table("data_table"), "time", LINEAR, "Value", ${Time}+1))) > 1 ? 0.1 : 1)

 

Det som görs är alltså en jämförelse av det absoluta utdatavärdet för den aktuella tidssteget jämfört med utdatavärdet om 1 sekund. Om skillnaden överstiger 1 minskas tidsstorleken till 0,1 s.

Det finns två if-satser, där den andra kallas om den förstas specifika begäran om tid == 0 inte uppfylls. Den andra jämför sedan skillnaden i utdata för aktuell tid och utdata en sekund senare. Om det absoluta värdet är större än ett sätts tidssteget till 0,1, annars behålls värdet 1. Tidssteget sänks också något innan ändringen i utdata sker. Hur länge tidssteget sänks kan minskas genom att minska den tid framåt som du tittar på utdatavärdet.

Jag hoppas att detta har varit till nytta. Tveka inte att kontakta oss på följande sätt support@volupe.com om du har några frågor.

Läs också:
Användning av glidande provfönster
Bubble Plots för utforskning av design
STAR-CCM+ syntax för fältfunktioner, del 1
Mallar och ini-filer
Utgivning av Simcenter STAR-CCM+ 2020.2 del 4

 

Fler blogginlägg

sv_SESwedish