CFD Online Discussion Forums

CFD Online Discussion Forums (https://www.cfd-online.com/Forums/)
-   Fluent UDF and Scheme Programming (https://www.cfd-online.com/Forums/fluent-udf/)
-   -   Scheme macro with random creation of waterdrops (https://www.cfd-online.com/Forums/fluent-udf/84468-scheme-macro-random-creation-waterdrops.html)

schemer January 31, 2011 04:05

Scheme macro with random creation of waterdrops
 
Hello,

I am using Fluent 6.3 to calculate a complex 2D biphasic simulation. At the moment, I want to patch water drops on a surface while the simulation is running. This should simulate raindrops on a windshield. That is why I just see the possibility to do that with a macro. I already wrote a command in scheme, but there is always an error when running the simulation. I have big problems in finding the mistake, because of a missing debugger in scheme.
My code is the following:


(cx-macro-define
'((autodrop . "(if (= (truncate (/ (rpgetvar 'flow-time) 0.05)) (+ (truncate (/ (- (rpgetvar 'flow-time) (rpgetvar 'physical-time-step)) 0.05)) 1)) (begin (ti-menu-load-string \"adapt/free-registers yes\") (do ((x 0 (+ x 0.05))) ((>= x 1)) (ti-menu-load-string \"adapt/mark-inout-circle yes no (* 3650 sin((/ (+ 100 (random 590)) 3650))) (- (* 3650 cos((/ (+ 100 (random 590)) 3650))) 3650) 1) (ti-menu-load-string \"solve/patch phase-water () sphere-r~a () mp 1\"))")
))

I want to add randomly every 0.05s a new drop to the windshield. I do this by marking a circle on the windshield and then patching it with water, but Fluent always runs into an EOF error. The sin() and cos() functions are needed to calculate the x-y-position on the windshield, because it is not flat.

I hope you can help me solving this problem. Maybe there is another possibility to patch without a macro while the simulation is running, too.

Thank you in advance for helping me!

schemer January 31, 2011 10:12

Ok, I improved the whole thing a bit. It seems to work now except the creation of a random value. Normally there should be instead of the 400(bold) a random number between 100 and 690. If you have any idea how to solve that problem, please let me know.
Here's my improved code:

(autodrop . "(define i 1) (define x 0) (if (= (truncate (/ (rpgetvar 'flow-time) 0.00003)) (+ (truncate (/ (- (rpgetvar 'flow-time) (rpgetvar 'physical-time-step)) 0.00003)) 1)) (begin (+ i 1) (+ x 1) (if (= x 25) (exit)) (if (= i 15) ((= i 1) )) (ti-menu-load-string \"adapt/mark-inout-circle yes no (* 3650 (sin (/ 400 3650))) (- (* 3650 (cos (/ 400 3650))) 3650) 1\") (ti-menu-load-string (format #f \"solve/patch phase-water () (~a) mp 1\" i))))")

Thanks for any help.

ComputerGuy January 31, 2011 21:41

Schemer,

I'm not much for writing scheme code, but I know this can be done with a UDF via a define_adjust udf (look up begin_f_loop(f,t)). You'll loop over all faces on a boundary, choose a random (or specified) X,Y coordinate, then choose your random value for the diameter(?) of the droplet.

Regards,
ComputerGuy

schemer February 1, 2011 09:05

Thanks for your answer.
At the moment, I'm giving my best to write an UDF, but I'm very unexperienced with C and writing UDFs. But here's my try:

Code:

DEFINE_ADJUST(drop_inject,d) {
Thread *t;
cell_t c;
real time = RP_Get_Real("flow-time");
real x_coord;
real y_coord;
real drop_area;

if (time % 0.0025 ==0.)
  {begin_f_loop(face, face_thread)
    {x_coord=3650.*sin((100.+rand()%590)/3650.);
    y_coord=-3650.+3650*cos((100.+rand()%590)/3650.);
    drop_area=M_PI*1.;
    F_VOF(face,t)=1.;
    }
    }
}

That is what I wrote until now and I know it's wrong. But I don't know how to say that he should fill the drop area which is at the x/y coordinate position with water.
Any help would be great!

schemer February 7, 2011 03:12

Is there anyone who can help me? I couldn't make any progress in that problem...


All times are GMT -4. The time now is 03:59.