Why are promoted names invalid when running in parallel?












0















I am trying to run a simple mathematical problem in parallel in OpenMDAO 2.5.0. The problem is an adapted version of the example in the OpenMDAO docs found here: http://openmdao.org/twodocs/versions/latest/features/core_features/grouping_components/parallel_group.html. It has some extra components and connections and uses promotions instead of connections.



from openmdao.api import Problem, IndepVarComp, ParallelGroup, ExecComp, Group, NonlinearBlockGS

prob = Problem()
model = prob.model

model.add_subsystem('p1', IndepVarComp('x1', 1.0), promotes=['x1'])
model.add_subsystem('p2', IndepVarComp('x2', 1.0), promotes=['x2'])

cycle = model.add_subsystem('cycle', Group(), promotes=['*'])

parallel = cycle.add_subsystem('parallel', ParallelGroup(), promotes=['*'])
parallel.add_subsystem('c1', ExecComp(['y1=(-2.0*x1+z)/3']), promotes=['x1', 'y1', 'z'])
parallel.add_subsystem('c2', ExecComp(['y2=(5.0*x2-z)/6']), promotes=['x2', 'y2', 'z'])

cycle.add_subsystem('c3', ExecComp(['z=(3.0*y1+7.0*y2)/10']), promotes=['y1', 'y2', 'z'])
model.add_subsystem('c4', ExecComp(['z2 = y1+y2']), promotes=['z2', 'y1', 'y2'])

cycle.nonlinear_solver = NonlinearBlockGS()

prob.setup(mode='fwd')
prob.set_solver_print(level=2)
prob.run_model()

print(prob['z2'])
print(prob['z'])
print(prob['y1'])
print(prob['y2'])


When I run this code in series, it works as expected with no errors.



However, when I run this code in parallel with:



mpirun -n 2 python Test.py


I get this error for the first process:



RuntimeError: The promoted name y1 is invalid because it refers to multiple inputs: [cycle.c3.y1 ,c4.y1]. Access the value from the connected output variable cycle.parallel.c1.y1 instead.


and this error for the second process:



RuntimeError: The promoted name y2 is invalid because it refers to multiple inputs: [cycle.c3.y2 ,c4.y2]. Access the value from the connected output variable cycle.parallel.c2.y2 instead.


So my question is: why does this example give an error in the promotes names when running in parallel, while it is running without problems in series? Is it only allowed to use connections when running in parallel or are promoted variables okay as well?










share|improve this question



























    0















    I am trying to run a simple mathematical problem in parallel in OpenMDAO 2.5.0. The problem is an adapted version of the example in the OpenMDAO docs found here: http://openmdao.org/twodocs/versions/latest/features/core_features/grouping_components/parallel_group.html. It has some extra components and connections and uses promotions instead of connections.



    from openmdao.api import Problem, IndepVarComp, ParallelGroup, ExecComp, Group, NonlinearBlockGS

    prob = Problem()
    model = prob.model

    model.add_subsystem('p1', IndepVarComp('x1', 1.0), promotes=['x1'])
    model.add_subsystem('p2', IndepVarComp('x2', 1.0), promotes=['x2'])

    cycle = model.add_subsystem('cycle', Group(), promotes=['*'])

    parallel = cycle.add_subsystem('parallel', ParallelGroup(), promotes=['*'])
    parallel.add_subsystem('c1', ExecComp(['y1=(-2.0*x1+z)/3']), promotes=['x1', 'y1', 'z'])
    parallel.add_subsystem('c2', ExecComp(['y2=(5.0*x2-z)/6']), promotes=['x2', 'y2', 'z'])

    cycle.add_subsystem('c3', ExecComp(['z=(3.0*y1+7.0*y2)/10']), promotes=['y1', 'y2', 'z'])
    model.add_subsystem('c4', ExecComp(['z2 = y1+y2']), promotes=['z2', 'y1', 'y2'])

    cycle.nonlinear_solver = NonlinearBlockGS()

    prob.setup(mode='fwd')
    prob.set_solver_print(level=2)
    prob.run_model()

    print(prob['z2'])
    print(prob['z'])
    print(prob['y1'])
    print(prob['y2'])


    When I run this code in series, it works as expected with no errors.



    However, when I run this code in parallel with:



    mpirun -n 2 python Test.py


    I get this error for the first process:



    RuntimeError: The promoted name y1 is invalid because it refers to multiple inputs: [cycle.c3.y1 ,c4.y1]. Access the value from the connected output variable cycle.parallel.c1.y1 instead.


    and this error for the second process:



    RuntimeError: The promoted name y2 is invalid because it refers to multiple inputs: [cycle.c3.y2 ,c4.y2]. Access the value from the connected output variable cycle.parallel.c2.y2 instead.


    So my question is: why does this example give an error in the promotes names when running in parallel, while it is running without problems in series? Is it only allowed to use connections when running in parallel or are promoted variables okay as well?










    share|improve this question

























      0












      0








      0








      I am trying to run a simple mathematical problem in parallel in OpenMDAO 2.5.0. The problem is an adapted version of the example in the OpenMDAO docs found here: http://openmdao.org/twodocs/versions/latest/features/core_features/grouping_components/parallel_group.html. It has some extra components and connections and uses promotions instead of connections.



      from openmdao.api import Problem, IndepVarComp, ParallelGroup, ExecComp, Group, NonlinearBlockGS

      prob = Problem()
      model = prob.model

      model.add_subsystem('p1', IndepVarComp('x1', 1.0), promotes=['x1'])
      model.add_subsystem('p2', IndepVarComp('x2', 1.0), promotes=['x2'])

      cycle = model.add_subsystem('cycle', Group(), promotes=['*'])

      parallel = cycle.add_subsystem('parallel', ParallelGroup(), promotes=['*'])
      parallel.add_subsystem('c1', ExecComp(['y1=(-2.0*x1+z)/3']), promotes=['x1', 'y1', 'z'])
      parallel.add_subsystem('c2', ExecComp(['y2=(5.0*x2-z)/6']), promotes=['x2', 'y2', 'z'])

      cycle.add_subsystem('c3', ExecComp(['z=(3.0*y1+7.0*y2)/10']), promotes=['y1', 'y2', 'z'])
      model.add_subsystem('c4', ExecComp(['z2 = y1+y2']), promotes=['z2', 'y1', 'y2'])

      cycle.nonlinear_solver = NonlinearBlockGS()

      prob.setup(mode='fwd')
      prob.set_solver_print(level=2)
      prob.run_model()

      print(prob['z2'])
      print(prob['z'])
      print(prob['y1'])
      print(prob['y2'])


      When I run this code in series, it works as expected with no errors.



      However, when I run this code in parallel with:



      mpirun -n 2 python Test.py


      I get this error for the first process:



      RuntimeError: The promoted name y1 is invalid because it refers to multiple inputs: [cycle.c3.y1 ,c4.y1]. Access the value from the connected output variable cycle.parallel.c1.y1 instead.


      and this error for the second process:



      RuntimeError: The promoted name y2 is invalid because it refers to multiple inputs: [cycle.c3.y2 ,c4.y2]. Access the value from the connected output variable cycle.parallel.c2.y2 instead.


      So my question is: why does this example give an error in the promotes names when running in parallel, while it is running without problems in series? Is it only allowed to use connections when running in parallel or are promoted variables okay as well?










      share|improve this question














      I am trying to run a simple mathematical problem in parallel in OpenMDAO 2.5.0. The problem is an adapted version of the example in the OpenMDAO docs found here: http://openmdao.org/twodocs/versions/latest/features/core_features/grouping_components/parallel_group.html. It has some extra components and connections and uses promotions instead of connections.



      from openmdao.api import Problem, IndepVarComp, ParallelGroup, ExecComp, Group, NonlinearBlockGS

      prob = Problem()
      model = prob.model

      model.add_subsystem('p1', IndepVarComp('x1', 1.0), promotes=['x1'])
      model.add_subsystem('p2', IndepVarComp('x2', 1.0), promotes=['x2'])

      cycle = model.add_subsystem('cycle', Group(), promotes=['*'])

      parallel = cycle.add_subsystem('parallel', ParallelGroup(), promotes=['*'])
      parallel.add_subsystem('c1', ExecComp(['y1=(-2.0*x1+z)/3']), promotes=['x1', 'y1', 'z'])
      parallel.add_subsystem('c2', ExecComp(['y2=(5.0*x2-z)/6']), promotes=['x2', 'y2', 'z'])

      cycle.add_subsystem('c3', ExecComp(['z=(3.0*y1+7.0*y2)/10']), promotes=['y1', 'y2', 'z'])
      model.add_subsystem('c4', ExecComp(['z2 = y1+y2']), promotes=['z2', 'y1', 'y2'])

      cycle.nonlinear_solver = NonlinearBlockGS()

      prob.setup(mode='fwd')
      prob.set_solver_print(level=2)
      prob.run_model()

      print(prob['z2'])
      print(prob['z'])
      print(prob['y1'])
      print(prob['y2'])


      When I run this code in series, it works as expected with no errors.



      However, when I run this code in parallel with:



      mpirun -n 2 python Test.py


      I get this error for the first process:



      RuntimeError: The promoted name y1 is invalid because it refers to multiple inputs: [cycle.c3.y1 ,c4.y1]. Access the value from the connected output variable cycle.parallel.c1.y1 instead.


      and this error for the second process:



      RuntimeError: The promoted name y2 is invalid because it refers to multiple inputs: [cycle.c3.y2 ,c4.y2]. Access the value from the connected output variable cycle.parallel.c2.y2 instead.


      So my question is: why does this example give an error in the promotes names when running in parallel, while it is running without problems in series? Is it only allowed to use connections when running in parallel or are promoted variables okay as well?







      openmdao






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 21 '18 at 14:20









      Anne-Liza BruggemanAnne-Liza Bruggeman

      103




      103
























          1 Answer
          1






          active

          oldest

          votes


















          0














          As of OpenMDAO V2.5, you have to be a little careful about how you access problem variables in parallel.



          If you look at the full stack track of your model, you can see that the error is being thrown right at the end when you call



          print(prob['y1'])
          print(prob['y2'])


          What is happening here is that you have set the model up so that y1 only exists on proc 0 and y2 only exists on proc 1. Then you try to get values that don't exist on that proc and you get (an admittedly not very clear) error.



          You can fix this with the following minor modification to your script:



          from openmdao.api import Problem, IndepVarComp, ParallelGroup, ExecComp, Group, NonlinearBlockJac

          prob = Problem()
          model = prob.model

          model.add_subsystem('p1', IndepVarComp('x1', 1.0), promotes=['x1'])
          model.add_subsystem('p2', IndepVarComp('x2', 1.0), promotes=['x2'])

          cycle = model.add_subsystem('cycle', Group(), promotes=['*'])

          parallel = cycle.add_subsystem('parallel', ParallelGroup(), promotes=['*'])
          parallel.add_subsystem('c1', ExecComp(['y1=(-2.0*x1+z)/3']), promotes=['x1', 'y1', 'z'])
          parallel.add_subsystem('c2', ExecComp(['y2=(5.0*x2-z)/6']), promotes=['x2', 'y2', 'z'])

          cycle.add_subsystem('c3', ExecComp(['z=(3.0*y1+7.0*y2)/10']), promotes=['y1', 'y2', 'z'])
          model.add_subsystem('c4', ExecComp(['z2 = y1+y2']), promotes=['z2', 'y1', 'y2'])

          cycle.nonlinear_solver = NonlinearBlockJac()

          prob.setup(mode='fwd')
          prob.set_solver_print(level=2)
          prob.run_model()

          print(prob['z2'])
          print(prob['z'])

          if prob.model.comm.rank == 0:
          print(prob['y1'])
          if prob.model.comm.rank == 0:
          print(prob['y2'])


          There are a few minor issues with this. 1) it means your script is now different for serial and parallel. 2) Its annoying. So we're working on a fix that will let things work more cleanly by automatically doing an MPI broadcast when you try to get a value thats no on your proc. That will be released in V2.6.



          One other small note. I changed you NL solver over to NonLinearBlockJac. That is for Block Jacobi, which is designed to work in parallel. You could also use the Newton solver in parallel The Gauss-Seidel solver won't actually allow you to get parallel speedups.






          share|improve this answer























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53414126%2fwhy-are-promoted-names-invalid-when-running-in-parallel%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            0














            As of OpenMDAO V2.5, you have to be a little careful about how you access problem variables in parallel.



            If you look at the full stack track of your model, you can see that the error is being thrown right at the end when you call



            print(prob['y1'])
            print(prob['y2'])


            What is happening here is that you have set the model up so that y1 only exists on proc 0 and y2 only exists on proc 1. Then you try to get values that don't exist on that proc and you get (an admittedly not very clear) error.



            You can fix this with the following minor modification to your script:



            from openmdao.api import Problem, IndepVarComp, ParallelGroup, ExecComp, Group, NonlinearBlockJac

            prob = Problem()
            model = prob.model

            model.add_subsystem('p1', IndepVarComp('x1', 1.0), promotes=['x1'])
            model.add_subsystem('p2', IndepVarComp('x2', 1.0), promotes=['x2'])

            cycle = model.add_subsystem('cycle', Group(), promotes=['*'])

            parallel = cycle.add_subsystem('parallel', ParallelGroup(), promotes=['*'])
            parallel.add_subsystem('c1', ExecComp(['y1=(-2.0*x1+z)/3']), promotes=['x1', 'y1', 'z'])
            parallel.add_subsystem('c2', ExecComp(['y2=(5.0*x2-z)/6']), promotes=['x2', 'y2', 'z'])

            cycle.add_subsystem('c3', ExecComp(['z=(3.0*y1+7.0*y2)/10']), promotes=['y1', 'y2', 'z'])
            model.add_subsystem('c4', ExecComp(['z2 = y1+y2']), promotes=['z2', 'y1', 'y2'])

            cycle.nonlinear_solver = NonlinearBlockJac()

            prob.setup(mode='fwd')
            prob.set_solver_print(level=2)
            prob.run_model()

            print(prob['z2'])
            print(prob['z'])

            if prob.model.comm.rank == 0:
            print(prob['y1'])
            if prob.model.comm.rank == 0:
            print(prob['y2'])


            There are a few minor issues with this. 1) it means your script is now different for serial and parallel. 2) Its annoying. So we're working on a fix that will let things work more cleanly by automatically doing an MPI broadcast when you try to get a value thats no on your proc. That will be released in V2.6.



            One other small note. I changed you NL solver over to NonLinearBlockJac. That is for Block Jacobi, which is designed to work in parallel. You could also use the Newton solver in parallel The Gauss-Seidel solver won't actually allow you to get parallel speedups.






            share|improve this answer




























              0














              As of OpenMDAO V2.5, you have to be a little careful about how you access problem variables in parallel.



              If you look at the full stack track of your model, you can see that the error is being thrown right at the end when you call



              print(prob['y1'])
              print(prob['y2'])


              What is happening here is that you have set the model up so that y1 only exists on proc 0 and y2 only exists on proc 1. Then you try to get values that don't exist on that proc and you get (an admittedly not very clear) error.



              You can fix this with the following minor modification to your script:



              from openmdao.api import Problem, IndepVarComp, ParallelGroup, ExecComp, Group, NonlinearBlockJac

              prob = Problem()
              model = prob.model

              model.add_subsystem('p1', IndepVarComp('x1', 1.0), promotes=['x1'])
              model.add_subsystem('p2', IndepVarComp('x2', 1.0), promotes=['x2'])

              cycle = model.add_subsystem('cycle', Group(), promotes=['*'])

              parallel = cycle.add_subsystem('parallel', ParallelGroup(), promotes=['*'])
              parallel.add_subsystem('c1', ExecComp(['y1=(-2.0*x1+z)/3']), promotes=['x1', 'y1', 'z'])
              parallel.add_subsystem('c2', ExecComp(['y2=(5.0*x2-z)/6']), promotes=['x2', 'y2', 'z'])

              cycle.add_subsystem('c3', ExecComp(['z=(3.0*y1+7.0*y2)/10']), promotes=['y1', 'y2', 'z'])
              model.add_subsystem('c4', ExecComp(['z2 = y1+y2']), promotes=['z2', 'y1', 'y2'])

              cycle.nonlinear_solver = NonlinearBlockJac()

              prob.setup(mode='fwd')
              prob.set_solver_print(level=2)
              prob.run_model()

              print(prob['z2'])
              print(prob['z'])

              if prob.model.comm.rank == 0:
              print(prob['y1'])
              if prob.model.comm.rank == 0:
              print(prob['y2'])


              There are a few minor issues with this. 1) it means your script is now different for serial and parallel. 2) Its annoying. So we're working on a fix that will let things work more cleanly by automatically doing an MPI broadcast when you try to get a value thats no on your proc. That will be released in V2.6.



              One other small note. I changed you NL solver over to NonLinearBlockJac. That is for Block Jacobi, which is designed to work in parallel. You could also use the Newton solver in parallel The Gauss-Seidel solver won't actually allow you to get parallel speedups.






              share|improve this answer


























                0












                0








                0







                As of OpenMDAO V2.5, you have to be a little careful about how you access problem variables in parallel.



                If you look at the full stack track of your model, you can see that the error is being thrown right at the end when you call



                print(prob['y1'])
                print(prob['y2'])


                What is happening here is that you have set the model up so that y1 only exists on proc 0 and y2 only exists on proc 1. Then you try to get values that don't exist on that proc and you get (an admittedly not very clear) error.



                You can fix this with the following minor modification to your script:



                from openmdao.api import Problem, IndepVarComp, ParallelGroup, ExecComp, Group, NonlinearBlockJac

                prob = Problem()
                model = prob.model

                model.add_subsystem('p1', IndepVarComp('x1', 1.0), promotes=['x1'])
                model.add_subsystem('p2', IndepVarComp('x2', 1.0), promotes=['x2'])

                cycle = model.add_subsystem('cycle', Group(), promotes=['*'])

                parallel = cycle.add_subsystem('parallel', ParallelGroup(), promotes=['*'])
                parallel.add_subsystem('c1', ExecComp(['y1=(-2.0*x1+z)/3']), promotes=['x1', 'y1', 'z'])
                parallel.add_subsystem('c2', ExecComp(['y2=(5.0*x2-z)/6']), promotes=['x2', 'y2', 'z'])

                cycle.add_subsystem('c3', ExecComp(['z=(3.0*y1+7.0*y2)/10']), promotes=['y1', 'y2', 'z'])
                model.add_subsystem('c4', ExecComp(['z2 = y1+y2']), promotes=['z2', 'y1', 'y2'])

                cycle.nonlinear_solver = NonlinearBlockJac()

                prob.setup(mode='fwd')
                prob.set_solver_print(level=2)
                prob.run_model()

                print(prob['z2'])
                print(prob['z'])

                if prob.model.comm.rank == 0:
                print(prob['y1'])
                if prob.model.comm.rank == 0:
                print(prob['y2'])


                There are a few minor issues with this. 1) it means your script is now different for serial and parallel. 2) Its annoying. So we're working on a fix that will let things work more cleanly by automatically doing an MPI broadcast when you try to get a value thats no on your proc. That will be released in V2.6.



                One other small note. I changed you NL solver over to NonLinearBlockJac. That is for Block Jacobi, which is designed to work in parallel. You could also use the Newton solver in parallel The Gauss-Seidel solver won't actually allow you to get parallel speedups.






                share|improve this answer













                As of OpenMDAO V2.5, you have to be a little careful about how you access problem variables in parallel.



                If you look at the full stack track of your model, you can see that the error is being thrown right at the end when you call



                print(prob['y1'])
                print(prob['y2'])


                What is happening here is that you have set the model up so that y1 only exists on proc 0 and y2 only exists on proc 1. Then you try to get values that don't exist on that proc and you get (an admittedly not very clear) error.



                You can fix this with the following minor modification to your script:



                from openmdao.api import Problem, IndepVarComp, ParallelGroup, ExecComp, Group, NonlinearBlockJac

                prob = Problem()
                model = prob.model

                model.add_subsystem('p1', IndepVarComp('x1', 1.0), promotes=['x1'])
                model.add_subsystem('p2', IndepVarComp('x2', 1.0), promotes=['x2'])

                cycle = model.add_subsystem('cycle', Group(), promotes=['*'])

                parallel = cycle.add_subsystem('parallel', ParallelGroup(), promotes=['*'])
                parallel.add_subsystem('c1', ExecComp(['y1=(-2.0*x1+z)/3']), promotes=['x1', 'y1', 'z'])
                parallel.add_subsystem('c2', ExecComp(['y2=(5.0*x2-z)/6']), promotes=['x2', 'y2', 'z'])

                cycle.add_subsystem('c3', ExecComp(['z=(3.0*y1+7.0*y2)/10']), promotes=['y1', 'y2', 'z'])
                model.add_subsystem('c4', ExecComp(['z2 = y1+y2']), promotes=['z2', 'y1', 'y2'])

                cycle.nonlinear_solver = NonlinearBlockJac()

                prob.setup(mode='fwd')
                prob.set_solver_print(level=2)
                prob.run_model()

                print(prob['z2'])
                print(prob['z'])

                if prob.model.comm.rank == 0:
                print(prob['y1'])
                if prob.model.comm.rank == 0:
                print(prob['y2'])


                There are a few minor issues with this. 1) it means your script is now different for serial and parallel. 2) Its annoying. So we're working on a fix that will let things work more cleanly by automatically doing an MPI broadcast when you try to get a value thats no on your proc. That will be released in V2.6.



                One other small note. I changed you NL solver over to NonLinearBlockJac. That is for Block Jacobi, which is designed to work in parallel. You could also use the Newton solver in parallel The Gauss-Seidel solver won't actually allow you to get parallel speedups.







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 21 '18 at 15:06









                Justin GrayJustin Gray

                2,4851615




                2,4851615
































                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53414126%2fwhy-are-promoted-names-invalid-when-running-in-parallel%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    這個網誌中的熱門文章

                    Academy of Television Arts & Sciences

                    L'Équipe

                    1995 France bombings